在Rspec中设置和跳过回调函数

3
我在模型中定义了一个回调函数,如下所示:
 after_commit :method, on: [:create, :update]

在我的测试中,我想要使用set_callback方法禁用此回调。我该如何做?

也许只是简单地设置一个桩函数?这样回调会运行,但不会执行任何操作。 - Sergio Tulentsev
你的Rails版本是什么?事务性固定设置是什么?在某些情况下(旧版本的Rails,transactional_fixtures=true),在测试期间永远不会运行after_commit。有关更多详细信息,请参见pull request - Anatoly
我正在使用Rails 4。我尝试了像Company.set_callback :commit, :after, :update_redis_keys, :on => [:create, :update]这样的代码,但它会在destroy时也设置回调。我想只在create和update时设置回调。 - utcghghvgh
2个回答

3
set_callback 用于给模型添加回调函数: http://apidock.com/rails/ActiveSupport/Callbacks/ClassMethods/set_callback 我认为这里应该使用 skip_callback : http://apidock.com/rails/ActiveSupport/Callbacks/ClassMethods/skip_callback 你可以这样调用它:
SomeModel.skip_callback(:commit, :after, :method)

通常在测试工厂中使用,例如跳过被称为some_methodbefore_save方法:

factory :user do
  after(:build) do |user|
    user.class.skip_callback(:save, :before, :some_method)
  end
end

1
每当您在工厂中使用时,都需要撤消/重置skip_callback,这会影响所有类,而不仅仅是该实例。 - Sairam
它确实影响到该类的所有实例。但在测试的情境下,通常这是可以接受的,您确实希望禁用所有实例的回调。 - jibai31
这将在测试用例/上下文中持续存在。例如,您必须撤消回调行为以进行测试。 - Thiago Petrone

-1

实际上,这对于 after_commit 不起作用。我得到了错误: NoMethodError: undefined method _after_commit_callbacks' for <Class:0x007fa81db97cc0> - zauzaj
@zauzaj 或许可以使用 SomeModel.skip_callback(:after) - Caillou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接