2012-03-01 33 views
10

Tôi đang cố gắng để có được RSpec làm việc cho một ứng dụng giàn giáo đơn giản, bắt đầu với các thử nghiệm giàn giáo rspec.rail3/rspec/devise: kiểm tra bộ điều khiển rspec không thành công trừ khi tôi thêm một dummy = subject.current_user.inspect

Mỗi wiki phát sinh, tôi đã thêm nhiều mục cấu hình khác nhau, một nhà máy cho người dùng và quản trị viên, và những điều đầu tiên tôi làm trong bộ điều khiển spec là login_admin.

kỳ lạ nhất điều, mặc dù ... tất cả thông số kỹ thuật của tôi thất bại trừ khi tôi thêm các tuyên bố sau ngay sau khi it ... do dòng:

dummy=subject.current_user.inspect 

(Với dòng, như hình dưới đây, các thông số kỹ thuật vượt qua Nếu không có dòng đó. , tất cả các bài kiểm tra thất bại với các chỉ định là nil thay vì giá trị dự kiến. Tôi chỉ tình cờ phát hiện ra rằng khi tôi đặt một số câu lệnh để xem liệu current_user đã được đặt chính xác chưa.)

Vì vậy, nó hoạt động như thế nào tuyên bố giả bằng cách nào đó 'buộc' current_user được nạp hoặc làm mới hoặc nhận ra.

Bất cứ ai có thể giải thích những gì đang xảy ra và tôi nên làm gì khác đi vì vậy tôi không cần câu lệnh giả?

#specs/controllers/brokers_controller_spec.rb 
describe BrokersController do 
    login_admin 

    def valid_attributes 
    {:name => "Bill", :email => "[email protected]", :company => "Example Inc", :community_id => 1} 
    end 

    def valid_session 
    {} 
    end 

    describe "GET index" do 
    it "assigns all brokers as @brokers" do 
     dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE! 
     broker = Broker.create! valid_attributes 
     get :index, {}, valid_session 
     assigns(:brokers).should eq([broker]) 
    end 
    end 
    describe "GET show" do 
    it "assigns the requested broker as @broker" do 
     dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE! 
     broker = Broker.create! valid_attributes 
     get :show, {:id => broker.to_param}, valid_session 
     assigns(:broker).should eq(broker) 
    end 
    end 

và theo devise wiki ở đây là làm thế nào tôi đăng nhập một: dùng hoặc: admin

#spec/support/controller_macros.rb 
module ControllerMacros 
    def login_admin 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:admin] 
     sign_in Factory.create(:admin) # Using factory girl as an example 
    end 
    end 

    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     user = Factory.create(:user) 
     user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module 
     sign_in user 
    end 
    end 
end 
+0

những gì bạn có trong login_admin? – apneadiving

+0

thêm nó vào cuối câu hỏi của tôi ngay bây giờ ... – jpwynn

+0

không thành công nếu bạn loại bỏ '.inspect'? có lẽ đó là một vấn đề khởi tạo. lỗi mà bạn nhận được cho các bài kiểm tra thất bại là gì? – phoet

Trả lời

14

Thật là một cuộc đấu tranh! Cảm ơn Robin, tôi đã googling về điều này trong nhiều giờ và cuối cùng đã nhìn thấy bài viết của bạn; bây giờ kiểm tra bộ điều khiển của tôi đang hoạt động :)

Để thêm vào câu trả lời của bạn, tôi đã tìm ra cách để đưa phiên chạy vào hash hợp lệ, cho phép kiểm tra bộ điều khiển chạy đúng như được tạo bởi đường ray.

def valid_session 
    {"warden.user.user.key" => session["warden.user.user.key"]} 
end 
+2

Cảm ơn vì điều này, @Birdlevitator! Bây giờ, tôi nghĩ bạn có thể chỉ cần làm: def valid_session phiên kết thúc – rafaelkin

+0

Chỉ cần thông báo câu trả lời này một vài tháng sau câu hỏi. mà dường như giải quyết vấn đề tốt hơn. – jpwynn

13

Trong các thử nghiệm của bạn, có đoạn mã sau:

def valid_session 
    {} 
end 
... 
    get :index, {}, valid_session 

Bởi vì điều này 'phiên' biến, "log_in" mà bạn đã làm về cơ bản không được sử dụng trong 'get'.

Cách mà tôi đã giải quyết nó là xóa tất cả đối số "valid_session" thành lệnh nhận, gửi, đặt, xóa trong thông số của bộ điều khiển đó. Ví dụ trên trở thành:

get :index, {} 

Tôi nghi ngờ rằng có cách thêm phiên của nhà phát triển vào băm "valid_session", nhưng tôi không biết nó là gì.

+0

Upvote, cảm ơn bạn, tôi đã bị chặn cho đến khi tôi tìm thấy điều này! –

+0

lên bỏ phiếu, cảm ơn giải pháp cuối cùng của bạn đã làm việc cho tôi :) – sameera207

2

Cảm ơn giải pháp này.

Nếu bạn đang sử dụng một mô hình Devise khác, id phiên cũng thay đổi.

Đối với một quản trị mô hình sử dụng như sau:

def valid_session 
    {'warden.user.administrator.key' => session['warden.user.administrator.key']} 
end 
Các vấn đề liên quan