2014-10-05 66 views
6

我想在我的Rails 4應用程序中爲控制器方法編寫一個簡單的獨立測試。該方法從查詢字符串中獲取ID,要求Project模型向我提供持久層的一些行,並將結果呈現爲JSON。如何在RSpec中用class_double存根類方法?

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實際打印到屏幕上。我究竟做錯了什麼?

+1

問題包裝更早自己:什麼是你甚至想幹什麼?看起來你真的想說'允許(項目)。接收(:for_company){[項目]}'... – 2016-01-19 23:42:23

回答

6

class_double實際上並沒有取代常數。您可以撥打as_stubbed_const取代原來的

class_double("Project").as_stubbed_const 

這是隻是一個方便周圍stub_const

+0

優秀。非常感謝 :) – 2014-10-05 11:38:31