C# Moq做到了。是<;列表<;列表<;字符串>&燃气轮机&燃气轮机;(x=>;x.Count==10)做我认为它应该做的事?

C# Moq做到了。是<;列表<;列表<;字符串>&燃气轮机&燃气轮机;(x=>;x.Count==10)做我认为它应该做的事?,c#,.net,unit-testing,moq,C#,.net,Unit Testing,Moq,我正在将其传递给一个正在进行单元测试的对象的构造函数 It.Is<List<List<string>>>(x => x.Count == 10) It.Is(x=>x.Count==10) 但当我进入构造函数时,该语句解析为null,而不是计数为10的a列表。我是否误解了它的工作原理?如果要将某些内容传递到对象的构造函数中,通常会使用模拟中的代理对象,并在该模拟上设置以提供类所需的任何上下文 例如: var mock = new Mock<Li

我正在将其传递给一个正在进行单元测试的对象的构造函数

It.Is<List<List<string>>>(x => x.Count == 10)
It.Is(x=>x.Count==10)

但当我进入构造函数时,该语句解析为null,而不是计数为10的a
列表。我是否误解了它的工作原理?

如果要将某些内容传递到对象的构造函数中,通常会使用模拟中的代理对象,并在该模拟上设置
以提供类所需的任何上下文

例如:

var mock = new Mock<List<List<string>>>();
mock.Setup(x => x.Count()).Returns(10);

var myClass = new MyClass(mock.Object);
var mock=new mock();
mock.Setup(x=>x.Count())。返回(10);
var myClass=新的myClass(mock.Object);
使用
验证
检查交互。这里有一个匹配器,您可以在
设置
验证
中使用它来匹配特定类型的参数

当然,除了你不能模拟
列表
,因为它没有你想要的虚拟方法。尝试使用并模拟,
ICollection


我想这应该是你想要的

不能调用
It.Is
方法。实际上,我认为它应该抛出,而不是返回类型的默认值

它用于设置期望值的表达式树中:

interface IFoo { bool DoSomething(IList<IList<string>> strings); }

var mock = new Mock<IFoo>();
mock.Setup(f => f.DoSomething(It.Is<IList<IList<string>>>(l => l.Count == 10))
    .Returns(true);

你在期待什么?计数为10ICollection的列表也不起作用。我没有访问mock的权限。ObjectIt是
mock
上的一个属性。如果您正在创建一个新的mock,您将有权访问
mock.Object
。所以,先做
newmock()
,然后再做
Mock.Object
——老实说,你会发现你有访问权限<代码>IList
也应该可以工作。
IList<IList<string>> listWith10Elements = // create a list with 10 elements
bool result = mock.Object.DoSomething(listWith10Elements);