【问题标题】:Ruby On Rails Controller Tests, Factories or Mocks?Ruby On Rails 控制器测试、工厂还是模拟?
【发布时间】:2014-01-29 09:52:51
【问题描述】:

我对 Rails 的测试部分比较陌生。我用过其他语言的单元测试。但是对于rails,我注意到一些使用模拟测试控制器的示例和其他使用工厂的示例,这里的最佳实践是什么?

使用模拟的示例:http://solnic.eu/2012/02/02/yes-you-should-write-controller-tests.html 使用工厂的示例:http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html

在我的研究中,我注意到了这个问题: Rails Model Testing - Mocking vs. Factories 控制器的答案是否相同?

我倾向于模拟,主要是为了加快速度并单独测试,但我看到暗示模拟会导致测试脆弱的 cmets。

【问题讨论】:

    标签: unit-testing rspec ruby-on-rails-4 mocking


    【解决方案1】:

    Mocks 最擅长让您隔离测试。如果您正在测试您的控制器发送的消息(您可能是这样),则没有理由将这些消息发送到真实的实例化工厂创建的对象。您可以将它们发送到模拟。

    如果你看第二个例子。大多数情况下,您对工厂所做的事情是使用它们生成一组有效的属性以发送到 POST 或 UPDATE 请求。无论如何,使用 attributes_for 不是整个对象。

    我发现,与控制器测试有关的这类问题对我来说确实很有趣,它强调了我们构建和使用 Rails 控制器的传统方式有时是如何存在缺陷的,并鼓励了很多非常非 OO实践。

    这里有一个替代方法的示例:https://www.youtube.com/watch?v=CGN4RFkhH2M 这可以很容易地使用模拟和遵循 Sandi Metz 在 Practical Object Oriented Design in Ruby 中提出的方法进行测试 - 以及本次演讲:http://www.confreaks.com/videos/2452-railsconf2013-the-magic-tricks-of-testing

    我提供了这两个链接,因为您似乎很想了解有关该主题的更多信息。

    【讨论】:

    • 感谢您的精彩回复!现在只看那些。关于在不破坏我的测试的情况下从工厂迁移到模拟的任何建议?
    • 所以我去看了一些我自己的控制器测试代码——我使用let(:valid_attrs) { email: some@email, name: "somename" }之类的东西而不是FactoryGirl.attributes_for
    • 也关于从工厂重构——就像很多重构有时后退并内联事物是改变方向的好方法——所以从工厂后退到实际创建对象然后应该从那里很容易重构这些对象用于模拟,只存根你需要存根的方法......记住控制器用于传递消息并为视图分配变量,所以实际上你将主要测试消息
    • 其他鼓励的重构或设计选择将使您的测试更容易,包括使用 Presenters/view_models 将进一步的复杂性从控制器降低到易于测试的 PORO
    • 另一边未发现的 factorygirl 有一个 build_stubbed 方法:robots.thoughtbot.com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多