这是什么?是吗?是什么?正在进行单元模拟测试

本文关键字:是什么 模拟 单元 测试 是吗 正在进行 | 更新日期: 2023-09-27 18:06:18

关于这个问题已经有很多问题了,但我认为我需要一些更基本的东西来澄清这个概念,因为我是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.IsAny<T>()指定该类型的任何内容。

It.Is<T>()更具体,需要一个lambda来确保它完全匹配。

都是指定参数的方法,而您在mock时不希望精确指定该参数。例如,如果参数是字符串名称而你不关心测试中的确切名称你可以使用:

模拟规范中的

It.IsAny<string>(),它将匹配任何字符串。

如果您总是希望名称以"S"然后你可以输入

It.Is<string>(x => x.StartsWith("S"))只匹配以s开头的字符串