【问题标题】:rspec / testing after_actionrspec / 测试 after_action
【发布时间】:2018-02-24 15:12:53
【问题描述】:

我猜我测试的方式不对,但我仍然想知道如何确保在 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 的其他方法是什么?

【问题讨论】:

    标签: ruby-on-rails rspec ruby-on-rails-5 rspec-rails


    【解决方案1】:

    试试have_received:

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

    【讨论】:

    • 2年过去了,积累了很多经验,这确实是最好的办法
    【解决方案2】:

    基本上就是这样。

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

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

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

    【讨论】:

    • 我想它应该适用于标准导轨模型;问题发生在“自定义”模块上(例如,app/lib/my_module.rb)。没试过,但问题可能与类相同
    • 但究竟是什么问题?正在发生什么,您会期待什么?
    • 如上所述。发布到控制器的 url (/abcd/receive) 时,然后测试该方法是否已被调用(后操作中的一种方法)显示的测试未通过
    • @Ben 我已经阅读了您的问题 10 次 - 您实际上并没有说期望失败。你要的是another approach。请更新您的问题,并粘贴 rspec 输出。
    • 确实,很抱歉
    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 2021-09-26
    • 1970-01-01
    • 2014-05-18
    • 2011-08-27
    • 2017-05-23
    • 2013-06-17
    • 2019-01-01
    相关资源
    最近更新 更多