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.
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
Grazie per averlo chiarito. Avete suggerimenti su come investigare ulteriormente il caricatore automatico di rails? –
http://guides.rubyonrails.org/autoloading_and_reloading_constants.html – max