2012-04-18 31 views
13

Hãy nói rằng tôi có giao diện:AutoFixture và giao diện

public interface IFoo 
{ 
    int Bar1 { get; set; } 
    int Bar2 { get; set; } 
} 

Nếu IFoo là lớp, tôi có thể viết:

fixture.CreateAnonymous<IFoo>(); 

và kết quả sẽ có số thiết lập cho Bar1Bar2.

Nhưng cách thực hiện điều này bằng giao diện? Tôi đã cố gắng sử dụng AutoMoqCustomization nhưng điều này có vẻ là cho các thuộc tính với loại giao diện và không phải là giao diện chính nó.

Tôi đang tìm cách tự động như CreateAnonymous là dành cho các lớp học. Currenlty Tôi đang tạo giao diện giả lập và thiết lập thuộc tính của nó một cách rõ ràng đó là công việc tôi muốn lưu. Tôi phải thiếu một cái gì đó hiển nhiên.

+1

Dưới đây là cách thực hiện công việc đó: http://blog.ploeh.dk/2013/04/08/how-to-automatically-populate-properties-with-automoq –

Trả lời

12

Nếu bạn muốn map an interface to a specific concrete class, bạn chắc chắn có thể làm điều đó:

fixture.Register<IFoo>(() => fixture.CreateAnonymous<ConcreteFoo>()); 

(Hoặc fixture.Register<IFoo>(fixture.CreateAnonymous<ConcreteFoo>) cho ngắn)

Tuy nhiên, AutoMoq (cũng như AutoRhinoMocks và AutoFakeItEasy) cũng là một lựa chọn. Với điều đó, một nỗ lực để tạo ra một thể hiện của IFoo sẽ trả về một proxy do Moq tạo để triển khai thực hiện IFoo.

Tuy nhiên, với Moq bạn sẽ không thấy Bar1 và Bar2 cư trú. Điều đó không chỉ vì AutoFixture không gọi các setters, mà bởi vì Moq không (theo mặc định) thực hiện các getters.

Để thực hiện công việc đó cho Moq, bạn cần phải gọi SetupAllProperties() trên chính bản thân Mock<T>. Trong khi có thể, đó là một chút khó khăn để làm trong đồ thị AutoMoq hiện tại. Đã có một work item cho việc này, nhưng nếu bạn đọc qua cuộc thảo luận, bạn sẽ thấy rằng vấn đề phức tạp hơn dường như.

Trong mọi trường hợp, giao diện với thuộc tính cũng là một ý tưởng tồi vì một số lý do khác, vì vậy giải pháp tốt nhất là thiết kế lại giao diện để nó không có thuộc tính.

+3

"giao diện với thuộc tính là ý tưởng tồi" - Luôn luôn? Nếu vậy bạn có thể cho tôi một liên kết? :) – Pol

+2

Rất nhiều lý do. Luật Demeter là một trong số họ: http://en.wikipedia.org/wiki/Law_of_Demeter Hãy để tôi hỏi điều gì đó đổi lại: lợi ích nào mà giao diện với các thuộc tính cung cấp? –

+0

Tôi quen thuộc với Luật Demeter. Tôi sử dụng các thuộc tính (trong 90% các trường hợp chỉ đọc) cho các thực thể nhưng chỉ cho một số tập con dữ liệu, chỉ vì Luật Demeter không cho tất cả dữ liệu. Tuy nhiên, đôi khi chúng hữu ích. – Pol

Các vấn đề liên quan