2013-09-26 335 views
7

tôi có các thiết lập sau:RSpec Bộ xử lý trong và ngoài namespace với cùng một tên

class UsersController < ApplicationController 
... 
end 

class Admin::BaseController < ApplicationController 
... 
end 

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

Và tương tự như vậy thông số kỹ thuật:

#spec/controllers/users_controller_spec.rb: 

describe UsersController do 
... 
end 

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

Tất cả các thông số kỹ thuật chạy tốt khi chạy independantly, tuy nhiên khi tôi chạy tất cả cùng nhau tôi nhận được cảnh báo:

toplevel constant UsersController referenced by Admin::UsersController 

Và thông số kỹ thuật từ bộ điều khiển quản trị không vượt qua.

Tuyến file:

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

...

Rails 4, RSpec 2.14

Tôi có thể không sử dụng cùng tên cho bộ điều khiển trong không gian tên khác nhau?

Trả lời

23

Điều này xảy ra khi một lớp cấp cao nhất được tự động tải trước khi sử dụng một tên miền được đặt tên. Nếu bạn có mã này mà không có bất kỳ lớp nào được tải trước:

UsersController 
module AdminArea 
    UsersController 
end 

Dòng đầu tiên sẽ kích hoạt móc bị thiếu hằng số: "ok, UsersController không tồn tại, vì vậy hãy thử tải nó".

Nhưng sau đó, đến dòng thứ hai, UsersController thực sự đã được xác định, ở cấp cao nhất. Vì vậy, không có hook const_missing được kích hoạt, và ứng dụng sẽ cố gắng sử dụng hằng số đã biết.

Để tránh điều đó, đòi hỏi một cách rõ ràng các lớp học phù hợp trên đầu trang của file spec của bạn:

#spec/controllers/users_controller_spec.rb: 

require 'users_controller' 

#spec/controllers/admin/users_controller_spec.rb 

require 'admin/users_controller' 
+0

này hoạt động. Rực rỡ! +1 –