如何在所有测试中禁用after_validation方法

时间:2012-05-22 18:04:43

标签: ruby-on-rails rspec

我正试图掌握Rails中的测试。

在我的一个模特中,我有after_validation :grab_external_stuffgrab_external_stuff是一种调用外部API的方法。我不想在我的测试中运行它。

在我的测试中禁用此after_validation方法的正确方法是什么?我该怎么做(使用rspec)?我在哪里做?

我知道存根可用于停止被调用的方法。但是我很难看到如何将它应用于after_validation或类似的钩子。

例如,假设我有一个属于项目的任务,属于用户。我运行一个工厂(:task),它也创建了相关的项目和用户。但是当验证用户时,会调用grab_external_stuff。

那么在我的测试中我应该指定我不想运行此方法?在测试中,在工厂中,在其他地方?

感谢您的任何建议。

2 个答案:

答案 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)

您可以按照建议here存根:grab_external_stuff方法。另一种方法是使用FakeWeb来存根API请求。这对集成测试来说可能更好 - 存根:grab_external_stuff更适合单元测试IMO。