何时使用模拟回调与回归?

bry*_*yan 5 c# unit-testing moq

我认为,这是一个非常直接的设置,其中创建搜索类型并将其传递到服务层并进入存储库,其中返回域类型的列表.搜索类型除了在存储库方法中构造表达式树之外什么都不做,基本上数据库的结果会返回.很简单

存储库界面:

public interface IDoNotSolicitRepo 
{
    IList<DNSContract> SelectWithCriteria(DNS_Search searchriteria); 
}
Run Code Online (Sandbox Code Playgroud)

实现存储库的服务:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在努力学习这个项目的Moq,我无法弄清楚我是否应该使用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());
}
Run Code Online (Sandbox Code Playgroud)

错误:

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]'.
Run Code Online (Sandbox Code Playgroud)

现在,我已经读过,Returns()方法返回传入的类型,所以我可以看到这是该错误的原因.但在现实世界中,我希望返回不同的类型.我试图创建一个回调委托,但没有一个感觉正确.

Sha*_*lde 3

只需将 lambda 放在 .Returns 上即可

.Returns(new List<DNSContract>());
Run Code Online (Sandbox Code Playgroud)

您的原始方法是将参数从您的方法传递到返回以参数化结果,例如,如果从可以根据输入返回不同数据的源中提取数据。

或者

.Returns<IList<DNSContract>>(new List<DNSContract>(){...});
Run Code Online (Sandbox Code Playgroud)