2012-01-12 11 views
5

Ho, quello che penso, è una semplice installazione in cui un tipo di ricerca viene creato e passato attraverso un livello di servizio e in un repository dove viene restituito un elenco di un tipo di dominio. Il tipo di ricerca non fa altro che costruire un albero di espressioni nel metodo del repository e fondamentalmente i risultati del database tornano. Abbastanza sempliceQuando utilizzare il callback di Mock contro il ritorno?

L'interfaccia repository:

public interface IDoNotSolicitRepo 
{ 
    IList<DNSContract> SelectWithCriteria(DNS_Search searchriteria); 
} 

Il servizio di attuazione del repository:

public class DoNotSolicitService : BaseBLLService, IDoNotSolicitService 
{ 
    private readonly IDoNotSolicitRepo repo; 
    private readonly IPartnerService partnerService; 
    private readonly IDoNotSolicitReasonService dnsReasonSvc; 
    public DoNotSolicitService(IDoNotSolicitRepo _repo, IPartnerService _partnerSvc, IDoNotSolicitReasonService _dnsReasonSvc) 
    { 
     repo = _repo; 
     partnerService = _partnerSvc; 
     dnsReasonSvc = _dnsReasonSvc; 
    } 

    public ServiceResult<DNSContract> SelectWithCriteria(DNS_Search searchriteria) 
    { 
     var results = repo.SelectWithCriteria(searchriteria); 

     return ReturnServiceResult(results); 
    } 
} 

Sto lavorando a imparare Moq con questo progetto e non riesco a capire se io' Dovrei usare un callback() o un return(). Ottengo i punti complessivi di entrambi, ma nessuno dei due sembra funzionare correttamente per me in questo momento.

La prova:

[Test] 
public void SelectWithCriteria_FirstName() 
{ 
    mockRepository.Setup(mr => mr.SelectWithCriteria(It.IsAny<DNS_Search>())) 
     .Returns((IList<DNSContract> records) => new List<DNSContract> 
                { 
                 new DNSContract {FirstName = "unit", LastName = "test"}, 
                 new DNSContract {FirstName = "moq", LastName = "setup"} 
                }); 

    dnsSvc = new DoNotSolicitService(mockRepository.Object, new PartnerServiceStub(), new DoNotSoicitReasonServiceStub()); 

    var result = dnsSvc.SelectWithCriteria(new DNS_Search { FirstName = "unit" }); 

    Assert.IsNotNull(result); 
    Assert.IsTrue(result.Data.Any()); 
} 

L'errore:

System.ArgumentException was unhandled by user code 


Message=Object of type 'EP.Rest.Common.RestHelpers.DNS_Search' cannot be converted to type 'System.Collections.Generic.IList`1[EP.Rest.Domain.Contracts.DNSContract]'. 

Ora, ho letto che i rendimenti() restituisce il tipo di passato in, così posso vedere che è la causa di quell'errore Ma nel mondo reale voglio che sia restituito il tipo diverso. Ho tentato di creare un delegato di callback, ma nessuno di questi ha avuto ragione.

+0

Guardando a questo, forse ho violato lo stub v. Finto v. Le responsabilità beffe quando quello che voglio, ma io sono ancora confusa sul richiamata o il ritorno. – BryanGrimes

+0

Controlla la risposta accettata per [questa domanda] (http://stackoverflow.com/questions/2833162/moq-callback-can-you-help-to-understand-it), dovrebbe darti una buona idea. Inoltre collega alla documentazione di Moq spiegandogli un po 'di più. –

+0

@BryanGrimes, ho pubblicato un esempio di callback sulla domanda di riferimento, forse questo sarà di aiuto. –

risposta

3

Basta inserire il lambda su .Returns cioè

.Returns(new List<DNSContract>()); 

vostro originale è passato nella argomenti dal tuo metodo ai rendimenti per parametrizzare i risultati ad esempio, se tirando da una fonte che può restituire i dati differenti a seconda di ingresso.

O

.Returns<IList<DNSContract>>(new List<DNSContract>(){...}); 
+0

Hai appena salvato la mia vista e il mio equilibrio mentale. Sembra che dovrò ancora scavare intorno al motivo per cui non potrebbe essere un callback, ma il mio test funziona, grazie. – BryanGrimes

Problemi correlati