Rails - 如何为整个测试套件存根方法?

时间:2012-07-25 17:33:36

标签: ruby-on-rails testing mocha stubs

现在我正在进行重构,我正在努力解决以下问题。

我有一个这样的课程:

class Example
  def self.some_method
    if Rails.env.test?
      true
    else
      hit_external_service
    end
  end
 end

现在,我认为将生产代码与测试代码混合在一起并不是很好。我们正在使用mocha,所以我想删除条件逻辑并为整个测试套件设置存根,因为这个方法被调用到所有地方,如下所示:

class ActiveSupport::TestCase
  setup do
    Example.stub(:some_method).returns(true)
  end
end

但是当我想测试原始方法时,我必须“取消存储”它看起来非常脏,所以我有点不知道如何做到这一点。

我还考虑过将外部服务命中的逻辑提取到另一个类,然后将该类作为可注入依赖项,因此对于我可以做的整个测试套件:

Example.external_service = DummyImplementation

然后我可以做的真实测试:

Example.external_service = RealImplementation

但这似乎有些过分,因为逻辑真的只有3行。

那么有什么建议吗?有什么简单的东西,也许我没有看到?

1 个答案:

答案 0 :(得分:1)

对于存根类方法,我通常在需要它的特定测试用例中创建存根,但是然后在拆解时取消存储该方法。像这样:

要求'test_helper'

class MyTest < ActiveSupport::TestCase

  def teardown
    Example.unstub(:some_method)
  end

  test "not hitting the service" do
    Example.stub(:some_method).returns(true)
    assert Example.some_method
  end

  test "hitting the service" do
    assert Example.some_method
  end

end