代码之家  ›  专栏  ›  技术社区  ›  Ben

rspec/行动后测试

  •  1
  • Ben  · 技术社区  · 7 年前

    我想我并没有以正确的方式进行测试,但我仍然想知道如何确保在after\u操作中触发方法调用。

    具备以下条件:

      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)
    

    此测试未通过。还有什么其他方法可以确保 MyModule.method 当到达url时调用?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Михаил Круглик    4 年前

    尝试 have_received :

    post  '/abcd/receive.json', params: params
    expect(MyModule).to have_received(:my_method)
    
        2
  •  0
  •   Greg    7 年前

    基本上就是这样做的。

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

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

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