2016-03-30 13 views
5

Ho un problema strano quando si crea una specifica di controller per un controller con nomi assegnati quando esiste anche un controller globale con lo stesso nome.Le specifiche del controller Rspec sul controller di nomi individuati trovano il controller globale con lo stesso nome

I nomi dei controller sono HomeController e Backend::HomeController.

Nota che non ho ancora creato il fileapp/controllers/backend/home_controller.rb, solo il controller globale esiste app/controllers/home_controller.rb

Pertanto mi aspetto che il test per esplodere con errori, ma non è così. Passa, tutto verde e felice.

mio spec assomiglia a questo

#spec/controllers/backend/home_controller_spec.rb 
require 'rails_helper' 

RSpec.describe Backend::HomeController, type: :controller do 
    before do 
    user = FactoryGirl.create(:user) 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    allow(controller).to receive(:current_user).and_return(user) 
    end 
    describe "GET #index" do 
    it "returns http success" do 
     get :index 
     expect(response).to have_http_status(:success) 
    end 
    end 

end 

Tuttavia se cambio il nome nel mio globale HomeController a qualcos'altro, ad esempio NotMyHomeController il test ha esito negativo con errori dicendo

Unable to autoload constant HomeController, expected app/controllers/home_controller.rb to define it 

Il che mi fa sospettare che Rspec non si occupa della parte "back-end" nella funzione Rspec.describe.

Sto facendo qualcosa di sbagliato o mi manca qualche altra parte vitale? IMHO, questa specifica non dovrebbe passare (parafrasando Gandalf).

sto usando Rails 4.2.6, RSpec-Rails 3.4.2

Aggiornamento

Come Max ha sottolineato, questo non è probabilmente in discussione Rspec ma invece qualcosa con Rails caricamento automatico.

Tuttavia ho provato semplicemente digitando

Backend::HomeController 

Nella console di Rails, ma non ho l'errore previsto

NameError: uninitialized constant Backend::HomeController 

E according to the Rails guide, sia la console e le autocaricamenti suite di test. Comunque penso che sia sulla strada giusta qui.

+0

I Suppongo che il caricatore automatico di Rails stia facendo qualcosa di avvincente: funziona con "Object.const_missing" monkeypatch che normalmente solleva "NameError: costante non inizializzato Backend :: HomeController". Ha molto poco con RSpec. – max

+0

Grazie per averlo chiarito. Avete suggerimenti su come investigare ulteriormente il caricatore automatico di rails? –

+0

http://guides.rubyonrails.org/autoloading_and_reloading_constants.html – max

risposta

1

Ho avuto questo stesso problema prima - si può leggere su tutta la questione qui:

Object.const_get and Rails - cutting off parent module names

ma la carne della risposta viene da this risposta da Apneadiving utente:

Be aware that there are vicious cases in Rails development mode. In order to gain speed, the strict minimum is loaded. Then Rails looks for classes definitions when needed.

But this sometimes fails big time example, when you have say ::User already loaded, and then look for ::Admin::User . Rails would not look for it, it will think ::User does the trick.

This can be solved using require_dependency statements in your code.

+0

Grazie! Ho finito per aggiungere 'require_dependency" # {:: Rails.root}/app/controller/backend/home_controller' nella parte superiore della mia specifica e ha risolto il problema –

Problemi correlati