我无法为我的某个控制器中使用的模拟设置期望值:
控制器/ blark_controller.rb
class BlarkController < ApplicationController
def show
user = User.first
user.inspect
render nothing: true
end
end
规格/控制器/ blark_controller_spec.rb
require 'spec_helper'
describe BlarkController do
describe 'GET :show' do
let(:user) { mock_model User }
before do
User.stub(:first).and_return(user)
get :show
end
it 'blarks' do
expect(user).to receive(:inspect)
end
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
我可以在规格中设定对模拟的期望吗?
答案 0 :(得分:2)
你可以,但你做这件事的方式是错误的。
您正在调用某个操作(get :show
),然后在调用它之后设置未来期望值(expect(user).to receive(:inspect)
)。显然这不会起作用,因为你已经称之为行动,这个测试没有前途。
您需要在调用操作之前设置期望(切换语句的顺序)或使用rspec最近添加的间谍功能来设置事后的期望。这使用have_received
而不是receive
。