C# 最小起订量C中的设置和返回是什么?
我读了一些关于C# 最小起订量C中的设置和返回是什么?,c#,moq,C#,Moq,我读了一些关于MoqC#包的教程,但我仍然不能真正理解Setup是什么,并且在Moq中返回 例如 mock.Setup(p => p.GetEmployeebyId(1)).ReturnsAsync("JK"); 例2 mock.Setup(x => x.Save(It.IsAny<DeskBooking>())).Callback<DeskBooking>( deskBooking => { savedDeskBooking =
Moq
C#包的教程,但我仍然不能真正理解Setup
是什么,并且在Moq
中返回
例如
mock.Setup(p => p.GetEmployeebyId(1)).ReturnsAsync("JK");
例2
mock.Setup(x => x.Save(It.IsAny<DeskBooking>())).Callback<DeskBooking>(
deskBooking =>
{
savedDeskBooking = deskBooking;
});
mock.Setup(x=>x.Save(It.IsAny()).Callback(
桌面预订=>
{
savedDeskBooking=桌面预订;
});
)在示例1中
mock.Setup(p => p.GetEmployeebyId(1)).ReturnsAsync("JK");
设置您的模拟,这样当调用GetEmployeebyId
时,以1作为参数,模拟将返回“JK”
在例2中
mock.Setup(x => x.Save(It.IsAny<DeskBooking>())).Callback<DeskBooking>(
deskBooking =>
{
savedDeskBooking = deskBooking;
});
mock.Setup(x=>x.Save(It.IsAny()).Callback(
桌面预订=>
{
savedDeskBooking=桌面预订;
});
当使用类型为DeskBooking
的任何参数调用Save
方法时,lambda函数将参数保存在savedDeskBooking
变量中。然后,您可以测试您是否保存了预期的DeskBooking
。TL;DR:设置
=何时,返回
=什么
无论何时编写单元测试,都需要确保给定的功能按预期工作。但大多数情况下,功能依赖于其他组件/环境/外部源/任何东西
为了使您的测试集中且可重放,我们需要使用双倍测试。这些将在测试期间替换依赖项。我们可以这样对测试进行分类:
- 伪:返回伪数据的简单代码
- 假:一个可以走捷径的工作备选方案
- 存根:带有预定义数据的自定义逻辑
- Mock:带有期望值的自定义逻辑(交互式存根)
- 垫片:运行时的自定义逻辑(用委托替换静态)
- 间谍:侦听器记录呼叫
因此,无论何时您想要创建一个mock,那么您必须告诉组件在什么情况下应该如何工作。换句话说,当使用特定输入调用函数时,什么应该是预期的输出
对于最小起订量,您可以使用设置
来定义时间。然后返回
,以指定所需内容
下面是一个简单的例子。假设您具有以下函数:
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);
}
public void指定偶数\u WhenICallMyMethod \u则应返回偶数
{
//安排
var serviceMock=new Mock();
serviceMock
.Setup(svc=>svc.GetNextNumber())
.申报表(2);
...
//表演
var result=SUT.MyMethod();
//断言
断言。相等(“偶数”,结果);
}
public void给定nanodNumber\u WhenICallMyMethod\u则应返回奇数
{
//安排
var serviceMock=new Mock();
serviceMock
.Setup(svc=>svc.GetNextNumber())
.申报表(1);
...
//表演
var result=SUT.MyMethod();
//断言
断言。相等(“奇数”,结果);
}
因此,正如您所看到的,我们使用了Setup
和Returns
来指导每个测试用例中的控制流
您的第二个示例可以被视为间谍,因为您正在记录输入以供后面的评估。如果示例2使用与示例1相同的方法名称,它看起来会是什么样子?参考文献感谢您的全面解释,peter。@Steve您需要关于此主题的进一步澄清吗?