2012-01-12 25 views
5

我有,我認爲,是一個非常簡單的設置,其中創建一個搜索類型,並通過服務層並傳遞到一個存儲庫,其中返回一個域類型的列表。搜索類型只會在存儲庫方法中構建表達式樹,基本上數據庫的結果會回來。很簡單何時使用Mock的回撥與回報?

的倉庫接口:

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

實施庫中的服務:

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

我工作的這個項目的學習起訂量,我無法弄清楚,如果我m應該使用Callback()或Return()。我得到了兩者的總體觀點,但是目前這兩方面似乎都不適合我。

測試:

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

錯誤:

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]'. 

現在,我讀過的收益()方法返回傳入的類型,所以我可以看到這是原因那個錯誤。但在現實世界中,我希望返回不同的類型。我試圖創建一個回調委託,但沒有一個感覺是正確的。

+0

在看這個,也許我已經違反了存根訴假訴模擬職責時,我想,但我仍然在回調或返回模糊。 – BryanGrimes 2012-01-12 20:46:32

+0

查看[這個問題]的接受答案(http://stackoverflow.com/questions/2833162/moq-callback-can-you-help-to-understand-it),應該給你一個不錯的主意。他還鏈接到Moq的文檔,解釋它有點進一步。 – 2012-01-12 20:57:10

+0

@BryanGrimes,我發佈了一個回調示例引用的問題,也許這會有所幫助。 – 2012-02-29 21:16:21

回答

3

剛落拉姆達上.Returns即

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

你原來在參數傳遞從你的方法的返回參數,例如,如果從可根據輸入返回不同的數據源拉動的結果。

或者

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

你剛剛救了我的視力和我的理智。看起來我仍然需要深入瞭解爲什麼這不可能是回調,但我的測試工作,謝謝。 – BryanGrimes 2012-01-12 21:06:51