2011-09-13 14 views
10

Sto provando a vedere se Moq è qualcosa che mi piacerebbe usare in un nuovo progetto dato che gli altri framework di beffa che ho usato stanno sfidando IMHO. Così, per esempio, ho un metodo come tale:Newbie che prova ad usare Moq per il metodo enumerabile

IEnumerable<PickList> GetPickLists(); 

io non sono sicuro di come dovrei prendere in giro questo ... Ho provato qualcosa di simile, ma sto ottenendo gli errori compliation (so che le seguenti Returns() non è corretto, ma non riesco a capire cosa mettere nel corpo Ritorni:

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

Inoltre, cercando di prendere in giro qualcosa di simile a questi due metodi:

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

So che sto chiedendo Una domanda generale, ma mi sto divertendo un po 'per iniziare. Il CHM nel download non ha abbastanza campioni per me e alcuni tutorial sembrano utilizzare metodi obsoleti e non coprono le enumerazioni che mi rendono difficile :(

Qualsiasi consiglio sarebbe molto apprezzato .

risposta

11

Prova

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

Il QuickStart è un buon riferimento

Alcuni esempi per gli altri metodi:.

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>()); 

Come parte, rendere l'IEnumerable generico nell'interfaccia originale per una migliore sicurezza del tipo.

È inoltre possibile utilizzare le specifiche funzionali della nuova Moq v4:

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

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

che non è così ben documentato attualmente. Si noti che non è più necessario scrivere mock.Object. Alcuni link:

La sintassi esatta (usando It.Is, il contenuto delle liste, ecc) dipenderà da ciò che si sta cercando di realizzare. It.IsAny corrisponderà a qualsiasi argomento, che renderà le cose più facili quando si gestiscono i parametri di sequenza o raccolta.

+0

Impressionante ... grazie! Iniziare a gelificare ... –

+0

Attaccare con esso; è una grande biblioteca. Puoi importare le DLL in [LINQPad] (http://www.linqpad.net/) e giocare con i tipi di derisione, se lo desideri. – TrueWill

+0

Domanda successiva ... E se l'oggetto che stai deridendo richiede parametri nel costruttore. Ad esempio: public CustomerSyncEngine (ILoggingProvider loggingProvider, ICrmProvider crmProvider, ICacheProvider cacheProvider) Come si ottengono i parametri del costruttore qui? –

Problemi correlati