Moq中Verifiable()的目的是什么?

Cas*_*nge 115 moq

目的是Verifiable()什么?

如果我验证Mock并将其保留,它仍会验证SetUp.

编辑:我正在使用VerifyAll()因此验证一切的原因.更改为Verify()只有我的.Verifiable() SetUps被检查.

Rub*_*ink 78

ADDENDUM:正如另一个答案所述,其目的.Verifiable是将一个Setup"延期Verify(...)呼叫" 登记在一起,然后通过触发来触发mock.Verify().

OP的澄清清楚地表明这是目标,唯一的问题是弄清楚它为什么不起作用,但正如@Liam所说,答案也应该触及这一点: -尽可能关键用例看是:

  • 保持a mock.Setup()和之间的干燥mock.Verify
  • 允许人们断开验证配置与实际Verify调用本身的连接(例如,您可以在另一个辅助方法中设置它)

...回到我的回答,简洁有效地说"小心,因为上述专业人士通常认为实现这些目标对于过度依赖这些结构的测试的易读性和可维护性的影响超过了"

ORIGINAL:请注意,在可能的情况下,应该遵循AAA布局,因此应该在完成工作后进行显式mock.Verify( expression )调用,而不是mock.Setup( ... ).Verifiable()与a mock.Verify()或者mock.VerifyAll()尽可能配对(credit:@kzu).

  • @EricSmith回顾过去,不要以为我说得足够强烈.将您的工作分成AAA捆绑比将过度集中在Arrange和Assert阶段之间的共同点上带来了更大的好处.90%的情况下,从最后表达验证调用的细微差别中可以获得一些东西,因此您应该花费大量时间对其进行优化,即使在某些情况下看起来像是一些痛苦的重复.http://manning.com/osherove非常清楚的一点是,对于跳入的人来说,让测试变得有意义是至关重要的 - 坚持惯例! (7认同)
  • @SteveChambers AAA的一个关键要素是它不是A* - 应该有一个Act和一个Assert.因此,虽然你在技术上正确地说你的代码较少,但你的哪些设置适用于哪些(子)Acts和(sub)Asserts的巧合总是会成为一个雷区.所以不,这不是硬性和快速,但我会说它甚至接近50:50将是非常糟糕的建议.(另请注意,除非您尝试在Act期间引入特定行为,否则您不需要执行安装程序来进行验证 - 这是明确测试的另一个要素) (5认同)
  • 我通常不会违背公认的智慧,但在所有情况下,我仍然不相信AAA与`Verifyable()`/`VerifyAll()`的好处.我当前的单元测试有大量的`Setup(...)`调用(> 30).可以使用等效的Verify()来匹配每个,以满足约定,但这会导致大量的代码重复,并且随着单元测试数量的增加而难以维护和读取.我想我真正要问的是,如果存在大量的设置或者是否可以避免使用`Verifiable()这是一个严格的规则? (3认同)

Suv*_*apa 47

当在Verify()测试结束时调用该方法时,如果没有调用标记为可验证的任何期望,则例外是thrown.

VerifyAll() 没有检查可验证的期望.

  • 您介意更多地解释一下VerifyAll() 不检查可验证的期望吗? (5认同)
  • @JW这意味着VerifyAll验证所有设置,而不考虑它们是否已被标记为可验证的期望。 (3认同)