Moq,在Verify(()

时间:2018-03-07 19:47:03

标签: c# unit-testing moq

好吧,我正在尝试学习一些关于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为我处理这个问题:)

欢迎任何帮助!

1 个答案:

答案 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

这两个库可以在测试时一起使用。