【问题标题】:What are some good approaches for stubbing dependancies in TDD?在 TDD 中存根依赖关系有哪些好的方法?
【发布时间】:2014-02-27 01:18:17
【问题描述】:

假设我正在 Rspec 中为 Rails 应用程序编写规范,并且我正在删除用于减少规范中依赖项数量的方法:

# specs/account_statistics_spec.rb

describe AccountStatistics do
 it "gets the percentage of users that are active in an account" do
  account = Account.new()
  account.stub_chain(:users, :size).and_return(80)
  account.stub_chain(:users, :active, :size).and_return(20)

  stats = AccountStatistics.new(account)

  stats.percentage_active.should == 25
 end
end

即使 Account#usersUser#active 方法未在各自的类中定义,现在也可以通过 AccountStatistics 规范。

有什么好的方法可以捕捉到存根方法可能无法实现的事实?是否应该由集成测试来捕获未定义的方法?或者规范是否应该在存根之前检查方法是否已定义?

如果有人可以链接到任何深入讨论存根和模拟的好书/演示文稿,那就太好了:)

【问题讨论】:

    标签: ruby-on-rails ruby rspec tdd stub


    【解决方案1】:

    要解决您的具体问题,请查看https://github.com/xaviershay/rspec-fire 以防止存根不存在的方法。

    我认为这里更广泛的问题是您没有听取尝试编写此测试给您的反馈。难以编写的测试是测试对象设计不佳或您使用的测试技术不合适的好兆头。

    如果这个类确实遵循得墨忒耳定律(与 ActiveModel 关系很难),它会是什么样子? 如果您提供一个测试双重对象而不是尝试模拟每个方法,您的测试会是什么样子? 作为集成测试,您的测试会是什么样子?

    我认为编写更好的测试的最佳资源是查看被测试代码的设计。 http://www.poodr.com/ 可能是一个很好的资源。 http://www.martinfowler.com/bliki/TestDouble.html 很好地概述了您可能不会考虑的测试替身,而 http://blakesmith.me/2012/02/29/test-stubbing-as-an-antipattern.html 提出了为什么模拟可能完全是错误的工具的论据。 特定于 rspec http://betterspecs.org 给出了一些命中,一个好的规范可能是什么样子。如果这些很难写,那就是一个很好的暗示,表明存在更广泛的问题。

    【讨论】:

    • 谢谢。我最终使用了 rspec-fire 并删除了 stub_chain 的使用。通过这种方式,我感到很舒服,因为我只是删除了现有方法的值,而不是方法本身。我完全同意听取测试的反馈。虽然在这种情况下我发现测试并不难编写,但我担心他们做出了太多假设
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多