【问题标题】:Getting into stubbing and mocking进入 stubbing 和 mocking
【发布时间】:2010-11-12 10:12:10
【问题描述】:

我一直在考虑学习存根和模拟,并且我知道几个可用的 .Net 库:RhinoMocks、Moq、TypeMock ......虽然我仍然不太清楚存根之间的区别,和嘲笑,我知道它在那里,我总是可以用谷歌搜索它。

我想知道,而不是 TDD 或类似的东西:

  • 学习曲线值得吗?我不太确定是否了解有关期望或在这种情况下会得到回报的所有小细节。

  • 生产增益是否比手动制作我的“虚拟实现”更大?我想是的,因为动态模拟/存根类更快。

  • 您会推荐哪个库?起订量似乎更容易。

  • 对于傻瓜来说,哪些是最好的资源(教程、书籍、视频...)并且或多或少是最新的?我不想了解某个库,当我下载最后一个版本时,发现显示的大部分 API 不再有效。

感谢一切。

【问题讨论】:

  • 因为答案是选项,所以这个问题应该是 Community Wiki (IMHO)
  • 使用正确的工具,学习曲线可以很容易。例如,在 java 中使用 mockito 非常简单,大约需要 10 分钟来学习。我相信您会为 .Net(或多个)找到类似的库。顺便说一句,这个问题似乎是一个重复 - 我敢肯定它之前已经被问过。尝试搜索一下。
  • 我没有足够的权限来启动 wiki 帖子。关于搜索所以,好吧,我搜索了一下,看到了其他几个帖子,但它们要么是旧的,要么没有按照我想要的水平涵盖我的问题,所以认为开始一个新问题不是一个坏主意.

标签: .net unit-testing mocking stubbing


【解决方案1】:
  • 学习曲线值得吗? - 是的,这并不难。一旦您知道如何使用模拟框架,您将节省大量的单元测试时间。

  • 比手动模拟更好? - 不一定,在某些情况下手动模拟可能会更好。但在 IMO 中,模拟框架通常是用最少的代码完成任务的最快方式。尝试这两种方法,您就会知道在特定情况下哪种方法最好。

  • 哪个库? - MoqRhino Mocks 是 .Net 上最受欢迎的 according to this poll,两者都具有丰富的功能且易于使用。使用 Rhino 有两种模拟方式(“记录和播放”和“AAA”模式)——我只使用 AAA 模式。我认为 Moq 只像 Rhino 'AAA' 模式那样工作,所以这可能会稍微不那么混乱。

  • 不确定具体资源,随便找个工具google一下,你会发现很多。

就模拟和存根之间的区别而言,模拟可以记录发生在它身上的事情(例如,在其上调用了哪些方法),而存根不能。当您开始使用它们时,您会发现更多信息。

【讨论】:

  • 我预计 NMock 和 JustMock 会有更多的选票。我在一些示例中看到了 Rhino 的记录和回放调用,并且对它增加的复杂性是值得的有点困惑,无论如何,我实际上并不知道它们是如何工作的/它们实际上是做什么的,所以我无法评论完全没有。
  • 是的,播放是旧的方式(并且不允许你在单元测试中遵循“安排行为断言”模式 - 也就是 AAA),我个人认为你可以忘掉它。这就是为什么我认为 Moq 可能是一个更好的选择,因为它不像 Rhino 那样具有那些 API 调用的遗留问题,所以它应该更容易学习。
【解决方案2】:

我已经使用FakeItEasy 几个月了,这真是太棒了!
我不能高度推荐它。

【讨论】:

  • 记下来了,我不知道,虽然距离上次提交源代码已经过去一个月了,它还处于活动状态吗?猜对了。
  • 它仍然处于活动状态,不过我已经有一段时间没有推送了。目前没有功能请求,所以我只有本地提交。
【解决方案3】:

我实际上使用RhinoMocks,虽然学习曲线相当痛苦,但现在我对结果非常满意。无论如何,它需要一些时间(或者,至少,我花了一些时间,但也许我有点愚蠢:))你比手动制作虚拟实现更快。我从未使用过您提到的任何其他库,因此无法对它们进行比较。

主页还包含一些很好的文档。

总的来说,我认为这是值得的,我会推荐它。

【讨论】:

  • 我看到 Rhino Mocks 的一个障碍是它的官方文档不是很好,是吗? Rhino Mocks 是我决定了解更多信息时的第一个赌注。
  • 是的,你完全正确:这是最大的障碍。无论如何,您可以在互联网上找到很多分散的信息,即在 stackoverflow 上您可以找到很多信息。
  • 这就是为什么我问最好的学习资源,以及为什么我谈论官方文档,当学习新的东西并且这似乎是一个广泛的主题时,我喜欢集中资源而不是不得不看通过几个网站,这些网站的信息可能会过时、稀缺或不符合我目前的知识水平。
  • 嗯,这取决于您使用新事物学习的首选方法。如果您像我一样,宁愿查看完整的注释示例,那么官方文档并不是那么好。否则,如果您有更“学术”的方法,那么官方文档可能就足够了。希望我已经解释了自己:)
【解决方案4】:

存根 - 模仿“真实”对象行为并负责保持测试可运行的假对象。

Mock - 用于断言测试是否通过的存根。


关于模拟框架 - 这个问题has been asked before

我自己的偏好是同时使用这两种方法。当我觉得使用框架更容易时,我会这样做,反之亦然——有时简单的假货就足够了,也更容易理解。不幸的是 - 在你真正学会使用一个之前,你将无法自己判断。

Moq 最近似乎是 .Net 空间中最流行的模拟框架。我也在用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多