2014-10-05 9 views
6

Próbuję napisać prosty izolowany test dla metody kontrolera w mojej aplikacji Rails 4. Metoda pobiera identyfikator z ciągu zapytania, prosi model Project o podanie niektórych wierszy z warstwy trwałości i renderuje wynik jako JSON.Jak wyprowadzić metodę klasy z class_double w RSpec?

class ProjectsController < ApplicationController 

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

end 

Zajmuję się krępowaniem metody for_company. Oto kod próbuję:

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 

Odkąd zgaszone metodę for_company, spodziewam wdrożenie metody mają być ignorowane. Jednakże, jeśli mój model wygląda następująco:

class Project < ActiveRecord::Base 

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

end 

... Wtedy widzę, że I should not be called jest faktycznie wydrukowane na ekranie. Co ja robię źle?

+1

pytań do wcześniejszego siebie: Co pan jeszcze zrobić? Wygląda na to, że chcesz powiedzieć 'allow (Project) .to receive (: for_company) {[project]}' ... –

Odpowiedz

6

class_double w rzeczywistości nie zastępuje stałej. Można zadzwonić as_stubbed_const zastąpić oryginalną

class_double("Project").as_stubbed_const 

To jest tylko otoki wygody wokół stub_const

+0

Excellent. Dziękuję bardzo :) –

Powiązane problemy