Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最小起订量C中的设置和返回是什么?_C#_Moq - Fatal编程技术网

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您需要关于此主题的进一步澄清吗?