现在我正在进行重构,我正在努力解决以下问题。
我有一个这样的课程:
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行。
那么有什么建议吗?有什么简单的东西,也许我没有看到?
答案 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