2013-11-28 28 views
1

我无法设置为我的控制器中的一个使用的模拟期望收到消息:预计模拟在轨控制器

控制器/ 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 

我可以在规范中设置模拟预期吗?

回答

2

你可以,但你这样做的方式是错误的。

你打电话给一个行动(get :show),然后调用它,设置未来期望值(expect(user).to receive(:inspect))。很明显,这是行不通的,因为你已经调用了这个动作,这个测试没有前途。

您可能需要在之前设置期望调用操作(切换语句的顺序)或使用rspec最近添加的间谍功能来设置事后的期望值。这使用have_received而不是receive

更多详情:https://www.relishapp.com/rspec/rspec-mocks/v/2-14/docs/spies/spy-on-a-stubbed-method-on-a-partial-mock