2012-04-18 14 views
13

Powiedzmy mam interfejs:AutoFixture i interfejsy

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

Jeśli IFoo była klasa, mogę napisać:

fixture.CreateAnonymous<IFoo>(); 

a wynik będzie miał wartości ustawione dla Bar1 i Bar2.

Ale jak to zrobić z interfejsem? Próbowałem użyć AutoMoqCustomization, ale wydaje się, że to jest dla właściwości z typem interfejsu, a nie ze sobą.

Szukam sposobu automatycznego, takiego jak CreateAnonymous dla klas. Currenlty Tworzę interfejs próbny i jawnie ustawiam jego właściwości, co jest pracą, którą chciałbym zapisać. Muszę pominąć coś oczywistego.

+1

Oto jak wykonać tę pracę: http://blog.ploeh.dk/2013/04/08/how-to-automatically-populate-properties-z -automoq –

Odpowiedz

12

Jeśli chcesz map an interface to a specific concrete class, z pewnością można to zrobić:

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

(Albo fixture.Register<IFoo>(fixture.CreateAnonymous<ConcreteFoo>) w skrócie)

Jednak AutoMoq (jak również AutoRhinoMocks i AutoFakeItEasy) jest również opcja. Dzięki temu próba utworzenia instancji IFoo zwróci utworzony przez Moq serwer proxy, który implementuje IFoo.

Jednak z Moq nie zobaczysz pól Bar1 i Bar2. To nie tylko dlatego, że AutoFixture nie wywołuje setterów, ale dlatego, że Moq nie (domyślnie) implementuje pobierające.

Aby wykonać tę operację dla Moq, należy wywołać właściwość SetupAllProperties() na samym komputerze Mock<T>. O ile to możliwe, jest to trochę trudne do zrobienia na bieżącym wykresie AutoMoq. Do tego jest już work item, ale jeśli przeczytasz tę dyskusję, zobaczysz, że problem jest bardziej złożony, niż mogłoby się wydawać.

W każdym razie, interfejsy z właściwościami są złym pomysłem z wielu innych powodów, więc najlepszym rozwiązaniem jest przeprojektowanie interfejsu tak, aby nie miał właściwości.

+3

"Interfejsy z właściwościami to zły pomysł" - Zawsze? Jeśli tak, możesz podać mi link? :) – Pol

+2

Wiele powodów. Prawo Demeter jest jednym z nich: http://en.wikipedia.org/wiki/Law_of_Demeter Pozwól mi zapytać o coś w zamian: jakie korzyści zapewnia interfejs z właściwościami? –

+0

Jestem zaznajomiony z prawem Demeter. Używam właściwości (w 90% przypadków tylko do odczytu) dla obiektów, ale tylko dla niektórych podzbiorów danych, tylko z powodu prawa Demeter nie dla wszystkich danych. Mimo to czasami są one przydatne. – Pol