如何在RSpec中使用class_double存根类方法?

Jez*_*mas 8 ruby rspec ruby-on-rails

我正在尝试在我的Rails 4应用程序中为控制器方法编写一个简单的隔离测试.该方法从查询字符串中获取ID,要求Project模型为持久层提供一些行,并将结果呈现为JSON.

class ProjectsController < ApplicationController

  def projects_for_company
    render json: Project.for_company(params[:company_id])
  end

end
Run Code Online (Sandbox Code Playgroud)

我正在努力使用该for_company方法.这是我正在尝试的代码:

require "rails_helper"

describe ProjectsController do

  describe "GET #projects_for_company" do

    it "returns a JSON string of projects for a company" do
      dbl = class_double("Project")
      project = FactoryGirl.build_stubbed(:project)
      allow(dbl).to receive(:for_company).and_return([project])
      get :projects_for_company
      expect(response.body).to eq([project].to_json)
    end

  end

end
Run Code Online (Sandbox Code Playgroud)

由于我已经删除了该for_company方法,因此我希望忽略该方法的实现.但是,如果我的模型看起来像这样:

class Project < ActiveRecord::Base

  def self.for_company(id)
    p "I should not be called"
  end

end
Run Code Online (Sandbox Code Playgroud)

...然后我可以看到它I should not be called实际上是打印到屏幕上的.我究竟做错了什么?

Fre*_*ung 10

class_double实际上并没有取代常数.您可以致电as_stubbed_const更换原件

class_double("Project").as_stubbed_const
Run Code Online (Sandbox Code Playgroud)

这只是一个方便的包装 stub_const

  • 哇。我花了几个小时来解决这个问题。文档对这一点非常不清楚!谢谢 (2认同)