1

我正在尝试在 Rails 中进行测试。

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

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

我知道存根可用于停止调用方法。但我正在努力了解如何将其应用于 after_validation 或类似的钩子。

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

那么在我的测试中应该在哪里指定我不想运行这个方法呢?在测试中,在工厂中,还是在其他地方?

感谢您的任何建议。

4

2 回答 2

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 块调用的事实是无关紧要的,因为它只是一个方法,可以像任何其他方法一样被存根。

编辑即使由于您在工厂中制造某些东西而进行了此验证,它仍然会被剔除。您将在测试中从 Factory 创建,但before将是before(:suite),:all:each,但无论如何,它将在it {}遇到之前运行并调用存根,因此在您的 Factory 被调用之前,这意味着它将始终被存根.

于 2012-05-22T18:09:23.077 回答
1

您可以按照此处:grab_external_stuff的建议对方法进行存根。另一种方法是使用FakeWeb对 API 请求进行存根。这对于集成测试可能更好——存根更适合单元测试 IMO。:grab_external_stuff

于 2012-05-22T20:49:21.813 回答