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


125

目的是Verifiable()什么?

如果我验证了Mock并将其遗漏,它仍会验证SetUp

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

Answers:


83

附录:如其他答案所述,的目的.Verifiable是让a Setup进入一组“延迟的Verify(...)呼叫”,然后可以通过触发这些呼叫mock.Verify()

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

  • 保持a mock.Setup()和之间的干燥度mock.Verify
  • 允许一个人将验证的配置与实际Verify调用本身断开(例如,您可以使用另一种帮助方法进行设置)

...然后回到我的回答,简洁地说:“要小心,因为通常认为上述优点不利于实现这些目标对测试的易读性和可维护性的影响,而测试的易读性和可维护性过于依赖于此类结构”

原文:请注意,在可能的情况下,应改用AAA布局,因此在完成工作后应进行显式mock.Verify( expression )调用,而不是mock.Setup( ... ).Verifiable()与a mock.Verify()mock.VerifyAll()任何可能配对(贷方:@kzu)。


7
@EricSmith回想一下,不要以为我说得足够强烈。将工作拆分为AAA捆绑,比集中精力安排和声明阶段之间的共性有更多的好处。在90%的时间里,从最后如何表达Verify调用的细微差别中可以获得一些好处,因此即使在某些情况下看起来有些痛苦的重复,您也应该花很多时间对其进行优化。manning.com/osherove提出的要点之一就是,使测试对进入的人有意义是至关重要的-因此请遵守约定!
Ruben Bartelink

3
我通常都不是反对公认的智慧的人,但是对于所有情况下AAA vs Verifyable()/ 的好处,我仍然不相信VerifyAll()。我当前的单元测试有大量Setup(...)调用(> 30)。可以使用等效的Verify()将每个匹配,以满足约定,但这会导致大量的代码重复,并且随着单元测试数量的增加,维护和读取起来会更加棘手。我想我真正要问的是,如果存在大量设置,是否可以设置例外Verifiable()?还是避免硬性规定?
史蒂夫·钱伯斯

5
@SteveChambers AAA的一个关键要素是它不是A *-应该有一个Act和一个Assert。因此,尽管您在说对您的代码更少方面在技术上是正确的,但是您的哪个设置的巧合适用于哪些(sub)Act和(sub)Asserts总是会成为雷区。所以不,这不是很难的,但是我要说暗示它甚至接近50:50是非常不好的建议。(还请注意,除非您试图在行为期间引入特定行为,否则无需进行设置即可进行验证,这是明确测试的又一要素)
Ruben Bartelink,

1
@Liam它真的完全好,你仍然相信它是你的工作,适当的工具-我真正的问题是只是它不赞成作为一般的方法来编写带有嘲笑的测试-尽管它巧妙地实现了干燥即在a Setup和a 之间Verify,可能会错过更高的胜利,只能按照AAA和强烈暗示的策略系列所建议的方式放宽DRY约束
Ruben Bartelink 2015年

1
@Liam感谢您的建议;我更新了答案,因为您的观点正确。回到我这样回答问题的那一天,我的观点通常是简洁地陈述一个原子性的答案,然后让竞争性答案像另一个答案一样填写地图。这些天(如果我仍然花时间回答问题),我可能会尝试给出更完整的答案,因为这在最初已经成为现实。
Ruben Bartelink,2015年

54

Verify()测试结束时调用该方法时,如果尚未调用任何标记为可验证的期望,则为thrown

VerifyAll() 不检查可验证的期望。


您介意解释一下更多有关VerifyAll()不检查可验证期望的情况吗?
JW

@JW这意味着VerifyAll会验证所有设置,而不考虑它们是否已标记为可验证的期望。
phoog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.