我正在尝试在我的Rails 4应用程序中为控制器方法编写一个简单的隔离测试。该方法从查询字符串中获取一个ID,要求Project
模型为持久层提供一些行,并将结果呈现为JSON。
class ProjectsController < ApplicationController
def projects_for_company
render json: Project.for_company(params[:company_id])
end
end
我正在努力使用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
由于我已经存根for_company
方法,我希望忽略该方法的实现。但是,如果我的模型看起来像这样:
class Project < ActiveRecord::Base
def self.for_company(id)
p "I should not be called"
end
end
...然后我可以看到I should not be called
实际上已经打印到屏幕上了。我做错了什么?
答案 0 :(得分:8)
class_double
实际上并不替换常量。您可以致电as_stubbed_const
来替换原来的
class_double("Project").as_stubbed_const
这只是围绕stub_const