【问题标题】:NUnit test fails unexpectedly in Async testing of a C# appNUnit 测试在 C# 应用程序的异步测试中意外失败
【发布时间】:2016-12-20 18:32:06
【问题描述】:

具有以下接口和类,我正在尝试对它们进行 nunit 测试,但测试失败,我无法找出原因。

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 Task UpdateBanckingAcc()
 {
    Amount = await _service.GetAccDetails(_personId);
 }
}

这是单元测试:

[Test]
public async void Test1([Values(200)]int personId)
{
 const double expectedResult = 20;    
 var serviceMock = new Mock<IAccountService>();

 var taskCompletion = new TaskCompletionSource<double>();
 taskCompletion.SetResult(10);
 serviceMock.Setup(x => x.GetAccDetails(It.Is<int>(id => id == personId)))
        .Returns(taskCompletion.Task);

 var person = new Person(personId, serviceMock.Object);

 await person.UpdateBanckingAcc();

 double res = person.Amount;
 Assert.AreEqual(expectedResult, res);
}

这个测试有什么问题?

【问题讨论】:

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


    【解决方案1】:

    断言消息不言自明:

    预计:20.0 天

    但是是:10.0d

    您的预期结果是 20,但是您错误地将 GetAccDetails() 存根为 10。更改以下行,您的测试将通过:

    taskCompletion.SetResult(20);
    

    【讨论】:

    • taskCompletion.SetResult(expectedResult); 可能更好。
    • 对不起,但这不是问题,我只是在发布这篇文章时放了随机数。所以数字是正确的
    • 我用正确的数字运行你的测试,它通过了。测试失败时会出现什么错误?
    【解决方案2】:

    正如 CodeFuller 已经提到的,您为任务提供的值与您的预期值不同。

    您还应该在设置模拟时使用ReturnsAsync 方法并使测试异步(您希望在创建异步方法时避免使用async void,除非它是一个事件处理程序,这是规则的例外) .

    [Test]
    public async Task Test1([Values(200)]int personId) {
        //Arrange
        double expectedResult = 20.0;
    
        var serviceMock = new Mock<IAccountService>();
    
        serviceMock
            .Setup(x => x.GetAccDetails(It.Is<int>(id => id == personId)))
            .ReturnsAsync(expectedResult); // User ReturnsAsync here
    
        var person = new Person(personId, serviceMock.Object);
    
        //Act
        await person.UpdateBanckingAcc();
    
        var actualResult = person.Amount;
    
        //Assert
        Assert.AreEqual(expectedResult, actualResult);
    }
    

    【讨论】:

    • 谢谢,我找到了问题:我忘了把keywork Task添加到方法的签名中
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 2023-01-04
    • 2021-12-17
    • 2012-03-25
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多