7

对于一个新的应用程序,我想开始涉足 BDD,我正在尝试在使用 RSpec 或 Thoughtbot 的 Shoulda 之间做出决定。我喜欢 Shoulda 使用的宏,而且它似乎并没有重新发明 Ruby/Rails 进行测试的方式,而只是提供了一个附加组件。另一方面,宏看起来有点“神奇”,而不是明确说明您正在测试的内容(但是我从涉猎中知道,在上面写一打“如果没有 xxx 应该无效”两行一个模型)。老实说,我发现为模型编写规范/测试非常简单,几乎无聊,但我发现为控制器编写它们非常困难,因为我永远不确定我应该测试什么或如何编写它。

我对 mocking 和 stubbing 的主题很不确定,因为我认为它们给了你错误的假设(因为你可以告诉它认为它有你需要的任何数据或假装调用了 Method X)而且我知道 RSpec 很重使用它们。我喜欢 RSPec 生成的文档,但我正在创建一个销售应用程序,而不是提供给客户,所以漂亮的文档没有那么有用。我喜欢 Cucumber,但它似乎有点矫枉过正(是的,我知道它可以与 Shoulda 一起使用)。

在这一点上,Rails 社区是支持 RSpec 还是 Shoulda?

4

8 回答 8

3

关于 mocks 和 stubs(以及 fakes、doubles 和诸如此类的东西)——当你在单元级别进行测试时,无论是使用TDD还是事后,重点是告诉它使用 Stub 认为它拥有你需要的数据。并且您为真实对象编写测试以确保它实际生成该数据。目的是检查被测类的内部行为,而不是检查其上游连接是否正常。那是在单元级别 - 您在集成或功能/故事/验收测试(或您喜欢的任何高级测试名称)中测试端到端行为。

在我看来,模拟对象更多的是关于下游的——你想检查被测类是否进行了适当的调用——你并不关心实际发生的任何事情,只是用正确的参数调用了正确的方法. 模拟非常适合这一点。Rspec 有自己的 mocking 框架,但MochaFlexMock也被广泛使用。

顺便说一句,这里有很多关于命名法的讨论/解释/辩论/激烈交锋。马丁·福勒(Martin Fowler)(他比大多数人更有资格在这个主题上发表意见)写了一篇开创性的博客文章来澄清它,我认为这是有道理的。这是另一篇文章,有几个例子

于 2009-10-19T13:37:02.883 回答
2

rails 社区支持 RSpec 和 Shoulda。这取决于开发商。如果您更喜欢Shouda,请使用它。
如果您更喜欢 RSpec,请使用它;)

它们都是具有相似目标的不同库。这并不意味着每个开发人员都必须支持或反对它。这仅意味着您可以使用其中任何一个。

您可以根据自己的喜好(以及与您合作的其他开发人员)做出选择。

于 2009-10-19T12:43:21.470 回答
1

您可以在 RSpec 中使用 shoulda 宏。这绝对不常见,但一个很好的选择:http ://robots.thoughtbot.com/post/159805987/speculating-with-shoulda 。

但正如雷达所说,最终你应该尝试不同的库并做出决定。

于 2009-10-20T21:46:53.063 回答
1

我使用带有 RSpec 的 Shoulda 匹配器。两全其美:RSpec 背后的大型社区、快速的开发以及对 Shoulda 匹配器的大量覆盖。

于 2010-03-29T02:09:53.000 回答
0

据我所知,既然你提到了 BDD,黄瓜和 RSpec 之间似乎有更自然的匹配。我最喜欢的应该是它的验证宏。在 RSpec 中有两个选项可以解决这个问题:

  1. 在 RSpec 中使用shoulda 宏,这是一个很好的选择,之前已回答
  2. 使用rspec-validations-expectations插件,小而鲜为人知,但它解决了这个问题(简单的 ActiveRecord 验证测试)。

您绝对应该选择哪个库对您来说最自然(如何表达测试)。对我来说,使用前面提到的选项,放弃 shoulda 选项(至少单独使用)更容易,我选择了 rspec 和 cucumber。

于 2010-01-08T09:44:41.533 回答
0

应该观察者:758。

RSpec 观察者:1279。

最终,由您决定您喜欢哪一个。

于 2009-10-20T06:12:48.613 回答
0

世界上很多 Rails 开发人员都使用RSpec,其中一些使用 Shoulda。Rails 的主要开发人员DHH更喜欢Test::UnitMinitestThoughbotShoulda建立在 Test::Unit(当然还有 Minitest)和 RSpec 之上。

最终,作为Rails 热线志愿者,您将从 RSpec 中获得更多社区支持,并且还有大量专门用于改进 RSpec 的额外宝石。话虽如此,Minitest 和 Test::Unite 是 Ruby 的核心。

[意见] 如果软件需要“行为流”,我倾向于使用 RSpec,如果需要纯单元功能,我倾向于使用 Minitest(主要是因为 Minitest 的基准库非常简单)。

于 2011-11-26T05:08:15.323 回答
0

我目前的测试工具堆栈是:

  • 验收测试牛排
  • Capybara 用于带驱动程序的浏览器模拟:Selenium 和 Akephalos
  • 存根的机械师
  • 用于单元测试的 Rspec
于 2011-01-01T01:50:17.073 回答