如何在控制器测试中使用简单的测试间谍?

时间:2014-01-26 08:34:14

标签: ruby-on-rails-4 rspec-rails

我正在尝试测试我的控制器只是调用服务对象上的方法。我认为测试间谍对此非常完美。我究竟做错了什么?谢谢你的帮助!

控制器:

class PostsController < ApplicationController

  def create
    @post = Post.new(post_params)

    if @post.save
      ServiceObject.new(@post).call
      redirect_to posts_path, success: "#{@post.title} was successfully created."
    else
      render action: :new
    end
  end

end

服务对象:

class ServiceObject

  def initialize(post)
    @post = post
  end

  def call
    puts "Service object was called!"
  end

end

控制器测试:

require 'spec_helper'

describe PostsController do
  describe 'POST #create' do
    it 'calls the service object' do
      service_object = double(ServiceObject)
      service_object.stub(:new).and_return(service_object)
      service_object.stub(:call)
      post :create, post: Fabricate.attributes_for(:post)
      expect(service_object).to have_received(:call)
    end
  end
end

错误:

Failure/Error: expect(service_object).to have_received(:call)
  (Double ServiceObject).call(any args)
      expected: 1 time with any arguments
      received: 0 times with any arguments

1 个答案:

答案 0 :(得分:1)

试试这个:

require 'spec_helper'

describe PostsController do
  describe 'POST #create' do
    let(:service_object) { double(:service_object) }

    before do
      ServiceObject.stub(:new).and_return(service_object)
      service_object.stub(:call)
    end  

    it 'calls the service object' do
      post :create, post: Fabricate.attributes_for(:post)

      expect(service_object).to have_received(:call)
    end
  end
end