【发布时间】:2015-01-26 18:06:54
【问题描述】:
我正在对返回 List<T> 的 async 方法进行单元测试。此方法依赖于映射类/接口。在我的单元测试中,我使用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;
}
}
【问题讨论】:
-
您应该避免在您的
async代码中使用Result(可能还有Task.Run)。 -
@StephenCleary...我不想要任务的价值吗? Task.Run 这里有什么问题?如果您认为值得,我会再提出一个问题。
-
await是检索结果的正确机制。Task.Run只能用于从 UI 层调用 CPU 绑定的方法,而在此代码中似乎并非如此。
标签: c# unit-testing moq