好吧,我正在尝试学习一些关于Moq的事情,有些事情让我很困惑。
我可以设置一个验证方法来检查是否已经调用了一个方法,这非常有效。但我想尝试别的东西:
所以,这很好:
mockNoteContext.Verify(ctx => ctx.SaveChanges(), Times.Once);
但是我试着伸展一下来做更多的检查:
mockNoteContext.Verify(ctx => ctx.Notes.Count() == 1);
不能工作,所以我开始玩了一下,得到了以下内容:
Expression<Func<NoteContext, bool>> expr = ctx => ctx.Notes.Count() == 1;
mockNoteContext.Verify(It.Is<Expression<Func<NoteContext, bool>>>(e => e == expr));
只提供空值异常。但我不明白为什么。可能它不知道如何处理&#39; e?这一切都让人觉得笨拙。如何正确设置?
当然我知道我可以读到:
var noteCount = mockNoteContext.Object.Notes.Count();
并断言,但我很好奇我如何利用Verify
为我处理这个问题:)
欢迎任何帮助!
答案 0 :(得分:0)
这不是如何使用Verify
电话。它用于验证是否调用了模拟上的成员。不要断言价值观。
查看文档https://github.com/Moq/moq4/wiki/Quickstart#verification
你在问题的最后建议的是断言价值的建议方式。
var expected = 1;
var noteCount = mockNoteContext.Object.Notes.Count();
Assert.AreEqual(expected, noteCount);
参考Moq Quickstart以更好地理解如何使用模拟框架。
还有专门用于断言的库。
一个这样的库是Fluent Assertions
Fluent Assertions是一组.NET扩展方法,允许您更自然地指定单元测试的预期结果。
例如
var expected = 1;
var noteCount = mockNoteContext.Object.Notes.Count();
noteCount.Should().Be(expected); //<-- fluent assertion
这两个库可以在测试时一起使用。