我正在试图弄清楚这个Mock(使用Moq框架)的东西是如何工作的,但是我对返回void的方法感到有些困惑。
原始对象具有以下方法/属性:
void Add(Person entity);
void Save();
IQueryable<Person> Persons;
Add方法调用InsertOnSubmit
(它是Linq to sql),Save方法调用Context.SubmitChanges()
。 Person的属性返回Table<News>
对象。
我不确定如何嘲笑这些方法,因为我显然不能使用Returns()
。
或者我的设计是否意味着我实际上无法正确地模拟对象?
答案 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而不是简单设置的函数一起使用。