2014-10-05 12 views
6

Sto provando a scrivere un semplice test isolato per un metodo controller nella mia app Rails 4. Il metodo accetta un ID da una stringa di query, chiede al modello Project di darmi alcune righe dal livello di persistenza e di rendere il risultato come JSON.Come faccio a stubare un metodo di classe con un class_double in RSpec?

class ProjectsController < ApplicationController 

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

end 

Sono in difficoltà con lo stubing del metodo for_company. Ecco il codice che sto cercando:

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 

Dal momento che ho spegnevano sotto il metodo for_company, mi aspetto l'attuazione del metodo per essere ignorato. Tuttavia, se il mio modello è simile al seguente:

class Project < ActiveRecord::Base 

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

end 

... Poi mi rendo conto che I should not be called viene stampata allo schermo. Che cosa sto facendo di sbagliato?

+1

domanda in precedenza sé: Che cosa stavi ancora cercando di fare? Sembra che tu in realtà volessi dire 'allow (Project) .per ricevere (: for_company) {[project]}' ... –

risposta

6

class_double in realtà non sostituisce la costante. È possibile chiamare as_stubbed_const per sostituire l'originale

class_double("Project").as_stubbed_const 

Questo è il solo un wrapper convenienza intorno stub_const

+0

Eccellente. Grazie mille :) –

Problemi correlati