2013-09-26 12 views
7

Ho la seguente configurazione:Controller RSpec dentro e fuori dello spazio dei nomi con lo stesso nome

class UsersController < ApplicationController 
... 
end 

class Admin::BaseController < ApplicationController 
... 
end 

class Admin::UsersController < Admin::BaseController 
... 
end 

e allo stesso modo le specifiche:

#spec/controllers/users_controller_spec.rb: 

describe UsersController do 
... 
end 

#spec/controllers/admin/users_controller_spec.rb 
describe Admin::UsersController do 
... 
end 

Tutte le specifiche funzionare bene quando viene eseguito in modo indipendente, ma quando corro tutti insieme ricevo l'avviso:

toplevel constant UsersController referenced by Admin::UsersController 

E le specifiche dal controller di amministrazione non passano. il file

Routes:

... 
resources :users 
namespace "admin" do 
    resources :users 
end 

...

Rails 4, Rspec 2.14

non posso usare lo stesso nome per i controller in diversi spazi dei nomi?

risposta

23

Ciò accade quando una classe di livello superiore viene caricata automaticamente prima di utilizzare uno spazio con nomi. Se si dispone di questo codice senza nessuna classe precaricata:

UsersController 
module AdminArea 
    UsersController 
end 

La prima riga attiverà costante gancio mancante: "ok, UsersController non esiste, quindi cerchiamo di caricarlo".

Ma poi, raggiungendo la seconda riga, UsersController è effettivamente già definito, al massimo livello. Pertanto, non viene attivato alcun hook const_missing e l'app proverà a utilizzare la costante conosciuta.

Per evitare che, richiedono esplicitamente classi appropriate in cima ai vostri file spec:

#spec/controllers/users_controller_spec.rb: 

require 'users_controller' 

E

#spec/controllers/admin/users_controller_spec.rb 

require 'admin/users_controller' 
+0

Questo funziona. Brillante! +1 –

Problemi correlati