【问题标题】:How to return a Task<string> using Moq?如何使用 Moq 返回任务<string>?
【发布时间】:2020-06-21 14:10:35
【问题描述】:

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

我想知道当我调用异步任务方法时应该如何返回Task&lt;string&gt;。我的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);
}

【问题讨论】:

  • 仅供参考 如果您在string result = await survey.GetResult(score); 之后有Assert.Equal(expected, result); 就足够了,并且您不必返回布尔值进行单元测试
  • 您的测试未显示async void 用法

标签: c# unit-testing task-parallel-library moq


【解决方案1】:

使用Task.FromResult(expected)

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

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

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

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

mock.Setup(arg =&gt; 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);
}

【讨论】:

  • 我以前不知道It.IsAny&lt;int&gt;()是一个东西,这非常有用,正是我所需要的。
【解决方案2】:

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

【讨论】:

  • 我添加了我的真实实现来澄清我的问题。
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多