C# 在单元模拟测试中,它是什么

C# 在单元模拟测试中,它是什么,c#,unit-testing,mocking,tdd,moq,C#,Unit Testing,Mocking,Tdd,Moq,有很多问题已经被问到了,但我想我需要一些更基本的东西来澄清这个概念,因为我是TDD的初学者。在那之前我不能前进 如果我有错误的理解,请你检查一下下面的测试方法并解释一下: [Test] public void ShouldSearch() { var ColumnList = new List<Column>(); [测试] public void ShouldSearch() { var ColumnList=新列表(); 下一行表示我在模仿对象 但是这个It

有很多问题已经被问到了,但我想我需要一些更基本的东西来澄清这个概念,因为我是TDD的初学者。在那之前我不能前进

如果我有错误的理解,请你检查一下下面的测试方法并解释一下:

[Test]
public void ShouldSearch()
{
         var ColumnList = new List<Column>();
[测试]
public void ShouldSearch()
{
var ColumnList=新列表();
下一行表示我在模仿对象

但是这个
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");
this.ColumnServiceMock.Setup(x=>x.GetColumn(It.IsAny(),It.IsAny())
.返回(列列表);
var result=this.getColumInfo.GetFinalRecords(this.context,this.gridColumn);
this.ColumnServiceMock.Verify(x=>x.GetColumn(It.Is(y=>y==this.context)),
它是(y=>y.Id==2)),乘以一次);
Assert.AreEqual(1,result.Data.Count,“不相等”);
Assert.IsTrue(result.Data.Success,“No Success”);
It.IsAny()
指定该类型的任何内容

It.Is()
更为具体,需要一个lamda来确保它与之完全匹配

这两种方法都只是指定一个参数的方法,您不希望在模拟时准确指定该参数。因此,例如,如果该参数是字符串名称,而您不关心测试中的确切名称,则可以使用:

模拟规范中的It.IsAny(),它将匹配任何字符串

如果您总是希望名称以“S”开头,那么您可以这样做

It.IsAny(x=>x.StartsWith(“S”)
只匹配以S开头的字符串。

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

this.ColumnServiceMock.Setup(x=>x.GetColumn(It.IsAny(),It.IsAny())。返回(ColumnList);

上面的意思是,无论何时使用任何参数调用
GetColumn
方法(只要它们分别是
Context
Column
类型),都返回
ColumnList

It.Is
允许您检查传入的内容,并确定传入的参数是否满足您的需要

this.ColumnServiceMock.Verify(x=>x.GetColumn(It.Is(y=>y==this.context)),It.Is(y=>y.Id==2)),次.Once);

上面断言,
GetColumn
方法只调用了一次,
Context
参数等于
this.Context
和Id属性等于2的
Column
参数


编辑:几年后,带着更多的知识重温这个答案。
this.ColumnServiceMock.Verify(x=>x.GetColumn(It.Is(y=>y==this.context),It.Is(y=>y.Id==2)),Times.Once);
可以缩短为
this.ColumnServiceMock.Verify(x=>x.GetColumn(this.context,It.Is(y=>y.Id==2)),Times.Once);
。您不需要使用它。为了检查引用是否相等,您可以直接传递对象。

在您的答案中的上下文中,当我们使用mock创建设置时,我们说将使用上下文的任何实例和列的任何实例调用GetColumn,同时该语句是否调用“GetColumn”方法?对安装程序的调用不会调用该方法,它只是确保在将来某个时候调用该方法时,它将返回您期望的值。例如,您有一个存储库,该存储库带有一个GetData方法,该方法进入数据库并返回一些行,以及一个控制器,该控制器依赖于存储库并格式化data.如果您正在测试控制器,您不想连接到数据库,因此您需要创建一个模拟存储库并调用安装程序,以确保您的GetData方法返回一些示例数据供控制器使用。谢谢v.mch:)恐怕最后一行应该是:It.Is(x=>x.StartsWith(“S”))