[英]What is Setup and Returns in MOQ C#?
我阅读了一些关于Moq
C# package 的教程,但我仍然无法真正理解Moq
中的Setup
和Returns
是什么。
例子,
mock.Setup(p => p.GetEmployeebyId(1)).ReturnsAsync("JK");
示例 2,
mock.Setup(x => x.Save(It.IsAny<DeskBooking>())).Callback<DeskBooking>(
deskBooking =>
{
savedDeskBooking = deskBooking;
});
)
在示例 1
mock.Setup(p => p.GetEmployeebyId(1)).ReturnsAsync("JK");
设置您的模拟,因此当使用 1 作为参数调用GetEmployeebyId
时,模拟将返回“JK”。
在示例 2 中
mock.Setup(x => x.Save(It.IsAny<DeskBooking>())).Callback<DeskBooking>(
deskBooking =>
{
savedDeskBooking = deskBooking;
});
当使用DeskBooking
类型的任何参数调用Save
方法时,lambda function 会将参数保存在savedDeskBooking
变量中。 然后,您可以测试您是否已保存预期的DeskBooking
。
TL;DR: Setup
= 何时, Returns
= 什么
每当您编写单元测试时,您都希望确保给定的功能按预期工作。 但大多数时候,功能取决于其他一些组件/环境/外部源/任何东西。
为了使您的测试集中且可重放,我们需要使用测试替身。 这些将在测试期间替换您的依赖项。 我们可以像这样对测试替身进行分类:
因此,无论何时你想创建一个模拟,你都必须告诉它在什么情况下组件应该如何表现。 换句话说,当使用特定输入调用 function 时,那么预期的 output 应该是什么。
如果是最小起订量,您可以使用Setup
来定义何时。 并Returns
指定什么。
这是一个简单的例子。 假设您有以下 function:
private IService service;
string MyMethod()
{
int number = service.GetNextNumber();
if(number % 2 == 0)
{
return "even";
}
else
{
return "odd";
}
}
然后您可以编写以下内容来测试用例:
public void GivenAnEvenNumber_WhenICallMyMethod_ThenItShouldReturnEven
{
//Arrange
var serviceMock = new Mock<IService>();
serviceMock
.Setup(svc => svc.GetNextNumber())
.Returns(2);
...
//Act
var result = SUT.MyMethod();
//Assert
Assert.Equal("even", result);
}
public void GivenAnOddNumber_WhenICallMyMethod_ThenItShouldReturnOdd
{
//Arrange
var serviceMock = new Mock<IService>();
serviceMock
.Setup(svc => svc.GetNextNumber())
.Returns(1);
...
//Act
var result = SUT.MyMethod();
//Assert
Assert.Equal("odd", result);
}
因此,如您所见,我们使用Setup
和Returns
来指导每个测试用例中的控制流。
你的第二个例子可以被认为是一个Spy ,因为你在那里记录了后面评估的输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.