使用Moq进行单元测试

时间:2015-01-26 18:06:54

标签: c# unit-testing moq

我正在对async方法进行单元测试,该方法返回List<T>。此方法依赖于映射类/接口。在我的单元测试中,我使用moq模拟了映射类。测试运行正常,返回的列表包含项目,但项目的值为空。我认为问题是因为我没有正确地删除映射类方法。我没有很多测试经验,所以感谢任何指导。

测试方法:

[TestMethod]
[TestCategory("CSR.Data.Tests.Services.ServiceSearchTest")]
public void SearchAccount()
    {
        // Arrange                 
        var mapper = new Mock<CSR.Data.Mapping.Interfaces.IMapper<Account, AccountDTO>>();

        mapper.Setup(i => i.Initialize());
        mapper.Setup(i => i.ToDomain(It.IsAny<AccountSearchResult>())).Returns(It.IsAny<Account>);
        mapper.Setup(i => i.DomainToDto(It.IsAny<Account>())).Returns(It.IsAny<AccountDTO>);

        var service = new ServiceSearch(null,mapper.Object);         
        string accountNumber = "123";
        string accountName = "";

        // Act 
        var results = service.SearchAccount(accountNumber, accountName);            

       // Assert
        Assert.IsTrue(results.Result.Count >= 1);
        }

我正在测试的方法/类:

    public class ServiceSearch : IServiceSearch
    {
    public ServiceSearch(IMapper<Claim, ClaimDTO> claimMapper, IMapper<Account, AccountDTO> accountMapper)
            {
                _claimMapper = claimMapper;
                _accountMapper = accountMapper;
            }

    public async Task<List<AccountDTO>> SearchAccount(string accountNumber, string accountName)
            {
                var accounts = new List<Account>();
                var accountDTOs = new List<AccountDTO>();
                var results = await Task.Run(() => base.AccountSearch(accountNumber, accountName).Result);

                if (results != null && results.Count > 0)
                {
                    //Map DH to Domain
                    _accountMapper.Initialize();

                    foreach (AccountSearchResult result in results)
                    {
                        accounts.Add(_accountMapper.ToDomain(result));
                    }

                    //Map Domain to DTO
                    foreach (Account account in accounts)
                    {
                        accountDTOs.Add(_accountMapper.DomainToDto(account));
                    }
                }
                return accountDTOs;
            }
}

2 个答案:

答案 0 :(得分:1)

这不是使用Mock对象的最佳位置,因为您将花费大量时间编写测试对象并模拟结果。设置调用的问题在于您尚未配置任何要在结果中发回的内容。一个正确的例子是:

// you would fully configure this object
AccountDTO expectedResult = new AccountDTO();  

mapper.Setup(i => i.ToDomain(It.IsAny<AccountSearchResult>())).Returns(expectedResult);

现在,您可以使用设置为不同的输入配置不同的accountDTO。

您还可以调用配置回调以在测试时生成帐户:

mapper.Setup(i => i.ToDomain(It.IsAny<AccountSearchResult>())).Returns<AccountSearchResult>(sr => {
   // build and return your dto here 
});

但是,除非您的映射器运行或创建成本高昂,否则我认为您最好只是确保它经过全面测试和接受,然后使用它继续直接生成DTO而不是试图模拟它出来了。

答案 1 :(得分:0)

您实际上并未在“.Returns”调用中设置对象。你需要确保设置“.Returns”以实际拥有一个带有值的对象。