使用Moq模拟一个无返回值的方法

7

我想弄清楚这个使用Moq框架的Mock是如何工作的,但是对于返回void的方法有些困惑。

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

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

Add方法调用InsertOnSubmit(它是Linq to sql),而Save方法调用Context.SubmitChanges()。Person属性返回Table对象。
我不确定如何模拟这些方法,因为我显然不能使用Returns()。
或者我的设计意味着我实际上无法正确地模拟这些对象?

没有更多的上下文,很难给出一个好的答案。 - mfloryan
1个回答

5

这取决于您想要测试什么。

当您想要测试被测试类与其他类之间的交互时,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());

如果你想测试其他东西并提供这些方法的存根实现,那么你可能只想创建一个测试实现,或考虑使用Moq设置,将函数表示为lambda而不是简单的设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接