期待mock在rails控制器中接收消息

时间:2013-11-28 04:10:50

标签: ruby-on-rails unit-testing rspec

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

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

我可以在规格中设定对模拟的期望吗?

1 个答案:

答案 0 :(得分: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