什么是在TDD中存根依赖关系的好方法?

时间:2014-02-27 01:18:18

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

假设我在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规范也可以通过。

有哪些好的方法可以捕获存根方法可能无法实现的事实?是否应该通过集成测试来捕获未定义的方法?或者规范是否也应该在对其进行定义之前检查方法是否已定义?

如果有人可以链接到任何有关深入讨论存根和嘲弄的好书/演示文稿,那也很棒。)

1 个答案:

答案 0 :(得分:3)

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

我认为这里更广泛的问题是你没有听到试图写这个测试给你的反馈。难以编写的测试是设计不良的测试对象或您使用的测试技术不适合的良好迹象。

如果它遵循Demeter定律(与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给出了一些好的规范看起来像什么。如果那些很难写,那就是一个很好的暗示,那就是更广泛的问题。