c# - 异步任务的 NUnit 测试在 C# 中失败

标签 c# nunit task-parallel-library task moq

我有以下类和接口(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/

async/await - when to return a Task vs void?

关于c# - 异步任务的 NUnit 测试在 C# 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41246413/

相关文章:

c# - 为什么 Parallel.Invoke 无法完成所有操作?

c# - skynet 基准测试中的 TPL 样本并非真正并行?

c# - 在列表框中搜索包含字符串的项目

javascript - 将 PDF 文件列表打印到客户的打印机

c# - 对于 Visual Studio 2008 中的 C#,我应该从哪个单元测试框架开始? (Windows 窗体应用程序)

c# - 使用 NUnit 测试调用私有(private)方法的公共(public)方法

c# - 在前提完成之前继续运行

c# - 什么是正则表达式平衡组?

c# - "Can not perform "赞 "on System.Decimal and System.String."

c# - 当我运行所有测试时单元测试失败,但当我调试时单元测试通过