如何使用 Moq return 任务<string>?
How to return a Task<string> using Moq?
我正在使用 XUnit
和 Moq
来测试逻辑层的代码。我的逻辑层也与数据层通信,所以我想模拟接口以保持我的测试简单。
我想知道在调用 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。但我会仔细检查存根,看看您是否指定了确实传递给实际实现的值,或者您是否遗漏了另一种方法的任何其他存根。
希望有所帮助:)
我正在使用 XUnit
和 Moq
来测试逻辑层的代码。我的逻辑层也与数据层通信,所以我想模拟接口以保持我的测试简单。
我想知道在调用 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。但我会仔细检查存根,看看您是否指定了确实传递给实际实现的值,或者您是否遗漏了另一种方法的任何其他存根。 希望有所帮助:)