rspec/测试after_action

rspec / testing after_action

我想我没有以正确的方式测试它,但我仍然想知道如何确保在 after_action.

中触发方法调用

具有以下特征:

  class AbcdController < ApplicationController
    after_action :handle_after, only: [:receive]
    def receive
       …… do some stuff
    end

    private

    def handle_after
       MyModule.my_method(some_data)
    end
  end

然后我想像这样测试它(在请求规范中):

post  '/abcd/receive.json', params: params
expect(MyModule).to receive(:my_method)

这个测试没有通过。当达到 url 时,确保调用 MyModule.method 的另一种方法是什么?

基本上就是这样。

也许,当你想要更多的集成方法时,而不是检查 MyModule 是否收到 :my_method 测试调用此模块的效果。 例如,如果它正在记录数据库中的事件,请检查

expect {post '/abcd/receive.json'}.to change{ Event.count }.by(1)

您需要在测试停止时定义边界,因此您必须在模拟量与深入检查应用程序行为之间取得平衡。

尝试 have_received:

post  '/abcd/receive.json', params: params
expect(MyModule).to have_received(:my_method)