2013-11-28 44 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