我是單元測試async
方法返回List<T>
。該方法依賴於映射類/接口。在我的單元測試中,我使用moq
來嘲笑映射類。測試運行正常,並且返回的列表包含項目,但項目的值爲空。我認爲這個問題是因爲我沒有正確地剔除映射類方法。我沒有很多測試經驗,所以任何指導都是值得讚賞的。單元測試使用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')。 – 2015-01-26 18:49:50
@StephenCleary ...我不想要任務的價值嗎? Task.Run在這裏有什麼問題?如果您認爲這是值得的,我會創建另一個問題。 – 2015-01-26 19:10:12
'await'是檢索結果的正確機制。 'Task.Run'應該只用於從UI層調用CPU綁定的方法,這在這段代碼中並不是這種情況。 – 2015-01-26 19:47:02