2

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

我有这样的课:

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 行。

那么有什么建议吗?有什么简单的东西可能我没有看到吗?

4

1 回答 1

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
于 2012-07-25T18:22:19.063 回答