【问题标题】:How do I use a simple test spy in a controller test?如何在控制器测试中使用简单的测试间谍?
【发布时间】:2014-01-26 08:34:13
【问题描述】:

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

控制器:

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

【问题讨论】:

  • 您是否检查过帖子正在保存并且if @post.save 正在返回true

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


【解决方案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

【讨论】:

  • 效果不错!我看到的主要区别是我创建双精度的方式:“double(ServiceObject)”与“double(:service_object)”。可能需要回去重温双打。谢谢!
  • 是的,没错——这就是关键的区别……那是创建一个由键 :service_object 标识的模拟对象……然后我们必须存根 ServiceObject 类的 new 方法以返回那个模拟对象,我们反过来在其上存根call,然后建立期望它接收到消息call
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多