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?
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]}' ... –