c# - it.isAny 和 it.is 在单元模拟测试中是什么

标签 c# unit-testing mocking tdd moq

关于这个已经有很多问题被问到,但我认为我需要一些更基本的东西来澄清这个概念,因为我是 TDD 的初学者。到那时我无法前进。

能否请您通过以下测试方法并解释我是否理解错误:

[Test]
public void ShouldSearch()
{
         var ColumnList = new List<Column>();

下一行表示我正在模拟对象。

但这是什么 It.IsAny<>()意思是这里?

 this.ColumnServiceMock.Setup(x => x.GetColumn(It.IsAny<Context>(), It.IsAny<Column>()))
                       .Returns(ColumnList);

 var result = this.getColouminfo.GetFinalRecords(this.context, this.gridColumn);

 this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context),
 It.Is<Column>(y => y.Id == 2)), Times.Once);

  Assert.AreEqual(1, result.Data.Count, "Not equal");

  Assert.IsTrue(result.Data.Success, "No success");

最佳答案

It.IsAny<T>正在检查参数是否为 T 类型,它可以是 T 类型的任何实例。它基本上是在说,我不在乎你在这里传递什么,只要它是 T 类型即可。

this.ColumnServiceMock.Setup(x => x.GetColumn(It.IsAny<Context>(), It.IsAny<Column>())).Returns(ColumnList);

以上是说每当 GetColumn使用任何参数调用方法(只要它们分别是 ContextColumn 的类型),返回 ColumnList .

It.Is<T>允许您检查传入的内容并确定传入的参数是否满足您的需求。

this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context), It.Is<Column>(y => y.Id == 2)), Times.Once);

以上断言 GetColumn使用 Context 调用了一次方法参数等于 this.Context和一个 Column Id属性为2的参数。

编辑:多年后以更多知识重温此答案。 this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context), It.Is<Column>(y => y.Id == 2)), Times.Once);可以缩短为this.ColumnServiceMock.Verify(x => x.GetColumn(this.context, It.Is<Column>(y => y.Id == 2)), Times.Once); .您不需要使用 It.Is 检查引用相等性,您可以直接传递对象。

关于c# - it.isAny 和 it.is 在单元模拟测试中是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39413652/

相关文章:

c# - 出错后重新启用 Microsoft Word 加载项

c# - 使用没有代码隐藏的 Azure AD

php - 在 Laravel 测试用例中模拟一个 http 请求并解析路由参数

c# - 尝试使用 JustMock 对事件进行单元测试

c# - 为什么要使用模拟框架?

c# - 使用反射创建测试对象

c# - List<T> 的自定义排序

unit-testing - 我可以更改特定流程的当前日期和时间吗?

java - 来自与测试类不同的类的模拟方法

java - 如何在 java 中的 mockito 中为 Map 对象创建参数捕获器?