如何使用 Moq return 任务<string>?

How to return a Task<string> using Moq?

我正在使用 XUnitMoq 来测试逻辑层的代码。我的逻辑层也与数据层通信,所以我想模拟接口以保持我的测试简单。

我想知道在调用 async Task 方法时我应该如何 return a Task<string>。我的 GetOrder 方法调用 GetOrderById 但数据层方法 return 为空。

编辑: 我根据所有反馈更改了我的单元测试。现在可以正常使用了。
我的测试:

public async void GetOrder()
{
    //Arrange 
    string expected = "test";
    
    var mock = new Mock<IRepository>();
    mock.Setup(arg => arg.GetOrderNameById(It.IsAny<int>())
        .Returns(Task.FromResult(expected));
    var survey = new SurveyResult(mock.Object);

    //Act 
    string result = await survey.GetOrderNameById(It.IsAny<int>()));

    //Assert
    Assert.Equal(expected, result);
}

使用Task.FromResult(expected)

mock.Setup(arg => arg.GetScoreByTotalWeighting(value)).Returns(Task.FromResult(expected))

我还建议避免将 value 作为参数,当您在返回结果时不关心该参数时。你可以使用 It.IsAny<int>(),像这样:

mock.Setup(arg => arg.GetScoreByTotalWeighting(It.IsAny<int>())).Returns(Task.FromResult(expected))

您使用 value == 0 设置 mock.Setup(arg => arg.GetScoreByTotalWeighting(value)) 然后使用 50 调用 survey.GetResult(score) 的问题。在两个地方使用 It.IsAny<int>() 来避免这个问题,或者传递相同的值:

mock.Setup(arg => arg.GetScoreByTotalWeighting(score))

解决方案:

public async Task GetResult()
{
    //Arrange 
    string expected = "test";

    var mock = new Mock<IRetreiveQuestionRepository>();
    mock.Setup(arg => arg.GetScoreByTotalWeighting(It.IsAny<int>()))
        .ReturnsAsync(expected);
    var survey = new SurveyResult(mock.Object);

    //Act 
    string result = await survey.GetResult(It.IsAny<int>());

    //Assert
    Assert.Equal(expected, result);
}

您应该能够使用您当前正在使用的 .ReturnsAsync 方法,在不知道实现的情况下很难说出您的主题为什么返回 null。但我会仔细检查存根,看看您是否指定了确实传递给实际实现的值,或者您是否遗漏了另一种方法的任何其他存根。 希望有所帮助:)