如何使用 Moq 返回任务<string>?

5 c# unit-testing moq task-parallel-library

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

Task<string>我想知道当我调用异步任务方法时应该如何返回 a 。我的GetOrder方法调用GetOrderById但数据层方法返回 null。

编辑:我根据所有反馈更改了单元测试。现在效果很好。
我的测试

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);
}
Run Code Online (Sandbox Code Playgroud)

Sia*_*eiK 5

使用Task.FromResult(expected)

mock.Setup(arg => arg.GetScoreByTotalWeighting(value)).Returns(Task.FromResult(expected))
Run Code Online (Sandbox Code Playgroud)

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

mock.Setup(arg => arg.GetScoreByTotalWeighting(It.IsAny<int>())).Returns(Task.FromResult(expected))
Run Code Online (Sandbox Code Playgroud)

问题是您设置然后mock.Setup(arg => arg.GetScoreByTotalWeighting(value))用调用。在两个地方使用以避免该问题,或传递相同的值:value == 0survey.GetResult(score)50It.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);
}
Run Code Online (Sandbox Code Playgroud)