Ruby on rails 期望mock在rails控制器中接收消息

Ruby on rails 期望mock在rails控制器中接收消息,ruby-on-rails,unit-testing,rspec,Ruby On Rails,Unit Testing,Rspec,我无法为我的一个控制器中使用的模拟设置期望值: 控制器/blark_controller.rb class BlarkController < ApplicationController def show user = User.first user.inspect render nothing: true end end 结果如下: 22:04:58 - INFO - Running: spec/controllers/blark_controller_

我无法为我的一个控制器中使用的模拟设置期望值:

控制器/blark_controller.rb

class BlarkController < ApplicationController
  def show
    user = User.first
    user.inspect
    render nothing: true
  end
end
结果如下:

22:04:58 - INFO - Running: spec/controllers/blark_controller_spec.rb

BlarkController
  GET :show
    blarks (FAILED - 1)

Failures:

  1) BlarkController GET :show blarks
     Failure/Error: expect(user).to receive(:inspect)
       (Double "User_1001").inspect(any args)
           expected: 1 time with any arguments
           received: 0 times with any arguments
     # ./spec/controllers/blark_controller_spec.rb:14:in `block (3 levels) in <top (required)>'

Finished in 0.15579 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/blark_controller_spec.rb:13 # BlarkController GET :show blarks
22:04:58-信息-运行:spec/controllers/blark_controller_spec.rb
BlarkController
获取:显示
blarks(失败-1)
失败:
1) BlarkController获取:显示blarks
失败/错误:预期(用户)。接收(:检查)
(双重“用户_1001”)。检查(任何参数)
预期:1次,有任何参数
收到:0次,有任何参数
#./spec/controllers/blark_controllers_spec.rb:14:in'block(3层)in'
以0.15579秒完成
1例,1例失败
失败的示例:
rspec./spec/controllers/blark#u controllers#u spec.rb:13#blarkcontrollerget:show blarks

我可以在规格中对模拟设定期望值吗?你可以,但你这样做的方式是错误的

您正在调用一个操作(
get:show
),然后在调用它之后,设置未来的期望(
expect(user.)。以接收(:inspect)
)。很明显,这将不起作用,因为您已经调用了操作,此测试没有未来

您需要在调用操作之前设置期望值(切换语句的顺序),或者使用rspec最近添加的spies功能在事件发生后设置期望值。这使用
have\u receive
而不是
receive

有关更多详细信息:

22:04:58 - INFO - Running: spec/controllers/blark_controller_spec.rb

BlarkController
  GET :show
    blarks (FAILED - 1)

Failures:

  1) BlarkController GET :show blarks
     Failure/Error: expect(user).to receive(:inspect)
       (Double "User_1001").inspect(any args)
           expected: 1 time with any arguments
           received: 0 times with any arguments
     # ./spec/controllers/blark_controller_spec.rb:14:in `block (3 levels) in <top (required)>'

Finished in 0.15579 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/blark_controller_spec.rb:13 # BlarkController GET :show blarks