2011-09-13 14 views
10

Próbuję sprawdzić, czy Moq jest czymś, co chciałbym użyć w nowym projekcie, ponieważ inne szydercze framugi, których używałem, stanowią wyzwanie dla IMHO. Tak na przykład, mam takie metody jak:Newbie próbuje użyć Moq do przeliczania metodą

IEnumerable<PickList> GetPickLists(); 

Nie jestem pewien, jak mam do tego kpić ... Próbowałem coś takiego, ale ja dostaję błędy compliation (znam następujące Returns() nie jest poprawna, ale nie można dowiedzieć się, co umieścić w organizmie Powroty:

var mockCrm = new Mock<ICrmProvider>(); 
mockCrm.Setup<IEnumerable<PickList>>(foo => foo.GetPickLists()) 
       .Returns<IEnumerable<PickList>>({}); 

Również próbuje szydzić coś podobnego tych dwóch metod:

CustomerSyncResult ApplyActions(IEnumerable<CustomerAction> actions); 
IEnumerable<Customer> GetCustomers(IEnumerable<string> crmIDs, IEnumerable<string> emails); 

Wiem, że pytam g ogólne pytanie, ale mam dużo czasu na rozpoczęcie. CHM w pobieraniu nie ma wystarczającej liczby próbek, a niektóre tutoriale wydają się używać przestarzałych metod, a także nie obejmują wyliczeń, co sprawia, że ​​jest to dla mnie trudne :(

Wszelkie wskazówki byłyby bardzo cenne .

Odpowiedz

11

Spróbuj

mockCrm.Setup(x => x.GetPickLists()) 
    .Returns(new List<PickList>()); 

QuickStart jest dobre referencje

kilka przykładów innych metod.

mockCrm.Setup(x => x.ApplyActions(It.IsAny<IEnumerable>())) 
    .Returns(new CustomerSyncResult()); 

mockCrm.Setup(x => x.GetCustomers(It.IsAny<IEnumerable>(), 
            It.IsAny<IEnumerable>())) 
    .Returns(new List<Customers>()); 

Odkładając na bok, przygotuj IEnumerable generic w oryginalnym interfejsie dla lepszego bezpieczeństwa typów.

Można również użyć specyfikacji funkcjonalnych nowego Min v4:

var list = new List<PickList> { new PickList() }; 

ICrmProvider crm = 
    Mock.Of<ICrmProvider>(
     x => 
     x.GetPickLists() == list); 

To nie jest tak dobrze udokumentowane komunikatu. Zauważ, że nie musisz już pisać mock.Object. Niektóre linki:

Dokładna składnia (używając It.Is zawartość list itp) będzie zależeć od tego, co starasz się osiągnąć. It.IsAny będzie dopasowywał dowolny argument, co ułatwi pracę z parametrami sekwencji lub kolekcji.

+0

Niesamowite ... dzięki! Zaczyna się żelować ... –

+0

Trzymaj się tego; to świetna biblioteka. Możesz importować biblioteki DLL do [LINQPad] (http://www.linqpad.net/) i bawić się z kpiącymi typami, jeśli chcesz. – TrueWill

+0

Pytanie uzupełniające ... co, jeśli obiekt, przed którym kpisz, wymaga parametrów w konstruktorze. Na przykład: publicznych CustomerSyncEngine (ILoggingProvider loggingProvider, ICrmProvider crmProvider, ICacheProvider cacheProvider) Jak uzyskać tam parametry konstruktora? –

Powiązane problemy