Moq是一种无效方法

时间:2011-02-03 16:55:13

标签: c# unit-testing mocking moq

我正在试图弄清楚这个Mock(使用Moq框架)的东西是如何工作的,但是我对返回void的方法感到有些困惑。

原始对象具有以下方法/属性:

void Add(Person entity);
void Save();
IQueryable<Person> Persons;

Add方法调用InsertOnSubmit(它是Linq to sql),Save方法调用Context.SubmitChanges()。 Person的属性返回Table<News>对象。

我不确定如何嘲笑这些方法,因为我显然不能使用Returns()

或者我的设计是否意味着我实际上无法正确地模拟对象?

1 个答案:

答案 0 :(得分:3)

这取决于您打算测试的内容。

当你想在被测试的类和其他类之间测试交互时,Moq可以帮助你。

在您描述的情况下,您可能正在测试使用上述方法和属性的类的类。要验证要检查是否使用预期参数调用Add方法的交互,请调用Save方法并引用Persons属性以读取结果。这可以通过以下方式实现:

var mockedClass = new Mock<IDaoClass>();
var classUnderTest = ...

mockedClass.SetupGet(m => m.Persons).Returns(new List<Person>().AsQueryable());

classUnderTest.DoSomething();

mockedClass.Verify( m => m.Add(It.IsAny<Person>())); 
mockedClass.Verify( m => m.Save());

如果您想测试其他内容并提供这些方法的 stub 实现,那么您可能只想创建一个测试实现,或者考虑将Moq设置与表达为lambda而不是简单设置的函数一起使用。