【问题标题】:BDD on Rails - Is the community more behind Shoulda or RSpec?Rails 上的 BDD - 社区更支持 Shoulda 还是 RSpec?
【发布时间】:2009-10-19 12:38:41
【问题描述】:

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

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

Rails 社区现在是支持 RSpec 还是应该支持?

【问题讨论】:

    标签: ruby-on-rails rspec bdd shoulda


    【解决方案1】:

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

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

    顺便说一句,这里有很多关于命名法的讨论/解释/辩论/激烈争论。 Martin Fowler(在这个问题上比大多数人更有资格发表)给clarify it写了一篇开创性的博客文章,我认为这是有道理的。这是another article, with a few examples

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            应该观察者:758。

            RSpec 观察者:1279。

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

            【讨论】:

            • 如果看不到它们背后的趋势,这些快照数字毫无意义。
            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

              • 验收测试牛排
              • 带有驱动程序的用于浏览器模拟的 Capybara:Selenium 和 Akephalos
              • 存根机械师
              • 用于单元测试的 Rspec

              【讨论】:

                【解决方案8】:

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

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-11-17
                  • 1970-01-01
                  • 2021-06-06
                  • 2019-07-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多