Moq做It.Is <list <list <string>&gt;&gt;(x =&gt; x.Count == 10)做我认为应该做的事情?</list <list <string>

时间:2011-02-10 14:53:58

标签: c# .net unit-testing moq

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

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

但是当我进入构造函数时,这个语句解析为null而不是一个数为10的List<List<string>>。我误解了它是如何工作的吗?

2 个答案:

答案 0 :(得分:2)

不打算调用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);

该示例设置了一个IFoo的模拟对象,当传递带有10个元素的IList<IList<string>>对象时,它将返回true。这意味着在以下调用之后,result将为真:

IList<IList<string>> listWith10Elements = // create a list with 10 elements
bool result = mock.Object.DoSomething(listWith10Elements);

答案 1 :(得分:0)

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

例如:

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

var myClass = new MyClass(mock.Object);

使用Verify检查互动情况。你有一个匹配器,你可以在SetupVerify中使用它来匹配特定类型的参数。

当然,除了你将无法模仿List,因为它没有你所追求的虚拟方法。请尝试使用和模拟ICollection<List<string>>

我认为这应该做你想要的。 Hope this helps.