我正试图掌握Rails中的测试。
在我的一个模特中,我有after_validation :grab_external_stuff
。 grab_external_stuff
是一种调用外部API的方法。我不想在我的测试中运行它。
在我的测试中禁用此after_validation
方法的正确方法是什么?我该怎么做(使用rspec)?我在哪里做?
我知道存根可用于停止被调用的方法。但是我很难看到如何将它应用于after_validation或类似的钩子。
例如,假设我有一个属于项目的任务,属于用户。我运行一个工厂(:task),它也创建了相关的项目和用户。但是当验证用户时,会调用grab_external_stuff。
那么在我的测试中我应该指定我不想运行此方法?在测试中,在工厂中,在其他地方?
感谢您的任何建议。
答案 0 :(得分:3)
grab_external_stuff
实际上是一种方法吗?也许在模块中定义或在您的某个模型中作为类方法?如果是这种情况,并且您确定自己从未希望它能够运行,那么就可以像你说的那样将其删除:
before(:suite) do
Model.any_instance.stub(:grab_external_stuff) { nil } # if it's an instance method
# or:
# Model.stub(:grab_external_stuff) { nil } if it's a class method, etc
end
您可以在spec_helper或每次测试等中进行设置。
这个方法被after_validation块调用的事实是无关紧要的,因为它只是一个方法,并且可以像任何其他方法一样存根。
编辑即使由于您在工厂中制作某些内容而进行此验证,它仍然会被删除。您将在测试中从工厂创建,但before
将是before(:suite)
,:all
或:each
,但无论如何,它将运行并调用之前的存根甚至遇到it {}
,因此在调用Factory之前,意味着总是被存根。
答案 1 :(得分:1)