我有以下类和接口(interface)
public interface IService
{
Task<double> GetAccDetails(int personId);
}
public class Person
{
private int _personId;
private IService _service;
public Person(int personId, IService service)
{
_personId= personId;
_service = service;
}
public double Amount {get; set;}
public async void UpdateBanckingAcc()
{
Amount = await _service.GetAccDetails(_personId);
}
}
我正在尝试为它编写 nunit 测试:
[Test]
public async void Test1([Values(200)]int personId)
{
const double expectedResult = 20;
var serviceMock = new Mock<IAccountService>();
//Here I tried both options:
//serviceMock.Setup(s => s.GetAccDetails(It.Is<int>(id => id == personId)))
// .ReturnsAsync(() => expectedResult);
//And:
serviceMock.Setup(s=> s.GetAccDetails(It.Is<int>(id => id == personId)))
.Returns(() => Task.FromResult<double>(personId));
var person = new Person(personId, serviceMock.Object);
person.UpdateBanckingAcc();
double res = person.Amount;
Assert.AreEqual(expectedResult, res);
}
测试失败。由于一些奇怪的原因,我无法调试它。
所以我在这里看到的问题是调用:
person.UpdateBanckingAcc();
应该是
await person.UpdateBanckingAcc();
但它不喜欢我使用 await
关键字。
请指教。
还有一个问题:在我应该测试的异步方法的 nunit 测试方面是否有一些特定的东西,比如任务状态测试等?
最佳答案
这里的问题是你的方法UpdateBankingAcc
有返回类型 void
应该返回 Task<T>
或 Task
,因此您需要更改它的签名以返回一个 Task
喜欢:
public async Task UpdateBanckingAcc()
{
Amount = await _service.GetAccDetails(_personId);
}
现在您需要将测试代码更改为:
await person.UpdateBanckingAcc();
double res = person.Amount;
Assert.AreEqual(expectedResult, res);
你不应该从异步方法返回 void,除非它是 UI 控件事件,你可以阅读以下关于使用异步和等待的最佳实践:
https://msdn.microsoft.com/en-us/magazine/jj991977.aspx
http://www.tonicodes.net/blog/why-you-should-almost-never-write-void-asynchronous-methods/
关于c# - 异步任务的 NUnit 测试在 C# 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41246413/