2016-03-30 15 views
5

Tôi có vấn đề lạ khi tạo thông số bộ điều khiển cho bộ điều khiển không gian tên khi cũng có bộ điều khiển chung có cùng tên.Thông số bộ điều khiển Rspec trên bộ điều khiển không gian tên tìm bộ điều khiển toàn cục có cùng tên

Tên bộ điều khiển là HomeControllerBackend::HomeController.

Lưu ý rằng Tôi chưa tạo file app/controllers/backend/home_controller.rb, chỉ có bộ điều khiển toàn cầu tồn tại app/controllers/home_controller.rb

Vì vậy, tôi hy vọng các thử nghiệm để phát nổ có lỗi, nhưng nó không. Nó trôi qua, tất cả đều xanh và hạnh phúc.

đặc tả của tôi trông như thế này

#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 

Tuy nhiên nếu tôi thay đổi tên trong toàn cầu HomeController của tôi để cái gì khác, ví dụ như NotMyHomeController thử nghiệm thất bại với lỗi nói

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

Mà làm cho tôi nghi ngờ rằng Rspec không bận tâm với phần "Phụ trợ" trong hàm Rspec.describe.

Tôi có làm điều gì sai hoặc tôi thiếu một số phần quan trọng khác không? IMHO, thông số này không được thông qua (để diễn giải Gandalf).

Tôi đang sử dụng Rails 4.2.6, RSpec-Rails 3.4.2

Cập nhật

Như Max chỉ ra, điều này có lẽ không phải ở vấn đề RSpec nhưng thay vì một cái gì đó với Rails động nạp.

Tuy nhiên tôi đã cố gắng chỉ cần gõ

Backend::HomeController 

Trong Rails console, nhưng ở đó tôi nhận được lỗi dự kiến ​​

NameError: uninitialized constant Backend::HomeController 

according to the Rails guide, cả hai giao diện điều khiển và tự động gọi kiểm tra bộ. Tuy nhiên tôi nghĩ rằng tôi đang đi đúng hướng ở đây.

+0

tôi Tôi đoán rằng Rails autoloader của nó làm một cái gì đó screwy - nó hoạt động bằng cách monkeypatching 'Object.const_missing' mà sẽ có bình thường chỉ cần nâng lên' NameError: uninitialized liên tục Backend :: HomeController'. Nó có rất ít với RSpec. – max

+0

Cảm ơn bạn đã thanh toán bù trừ cho tôi. Bạn có bất kỳ đề xuất nào về cách điều tra Trình tải tự động của Rails thêm không? –

+0

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

Trả lời

1

Tôi có vấn đề này cùng trước - bạn có thể đọc về toàn bộ vấn đề ở đây:

Object.const_get and Rails - cutting off parent module names

nhưng thịt của câu trả lời xuất phát từ this câu trả lời từ người sử dụng Apneadiving:

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

Cảm ơn bạn! Tôi đã kết thúc thêm 'require_dependency" # {:: Rails.root}/app/controllers/backend/home_controller' vào đầu spec của tôi và nó giải quyết được vấn đề –

Các vấn đề liên quan