2012-09-01 31 views
9

Vì một lý do nào đó, tôi không thể lấy phương thức trợ giúp của người viết ra sign_in để làm việc. current_user tiếp tục là null. Bất kỳ ý tưởng những gì vấn đề có thể được?Devise Test Helper - sign_in không hoạt động

Test:

before :each do 
    @user = FactoryGirl.create :user 
    sign_in @user 
    end 

    describe "GET index" do 
    it "assigns all subscribers as @subscribers" do 
     subscriber = @user.subscribers.create! valid_attributes 
     get :index 
     assigns(:subscribers).should eq([subscriber]) 
    end 
    end 

Thực hiện:

def index 
    @subscribers = current_user.subscribers.all <------- ERROR 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @subscribers } 
    end 
    end 

Error: 
NoMethodError: 
     undefined method `subscribers' for nil:NilClass 

Any help is appreciated. Cảm ơn!

Trả lời

8

Có vẻ như bạn đã giải quyết vấn đề này, dựa vào mã của bạn. Tôi đã có điều này xảy ra trước đây, và vì một lý do nào đó nó đã giúp tôi mỗi lần.

Giàn giáo rspec/rails cho thông số kỹ thuật điều khiển sẽ không hoạt động với Devise :: TestHelpers ra khỏi hộp.

get :index, {}, valid_session 

Cuộc gọi valid_session ghi đè nội dung phiên được thiết lập. Xóa nó:

get :index, {} 

Điều này sẽ hoạt động!

+0

yup, đó là vấn đề! Cảm ơn! :) – Karan

+1

Lúc đầu, tôi nghĩ rằng điều này không làm việc vì tôi đã thử nó trong một phiên gỡ lỗi 'pry' và nó không thành công. Thoát khỏi nâng lên và thiết lập nó, nó sau đó làm việc cho tôi. –

+0

Bạn đang nói chính xác về tập tin nào? – d34th4ck3r

5

Để biết thông số kỹ thuật, hãy đảm bảo là include Devise::TestHelpers. Để làm cho nó dễ dàng, trong spec của tôi/spec_helper.rb, tôi có:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

tự động bao gồm nó cho tất cả các thông số kỹ thuật điều khiển.

Ngoài ra, bạn cần phải làm điều này để có được sign_in làm việc:

@request.env["devise.mapping"] = Devise.mappings[:user] 
get :new 

Nó có lẽ là tốt nhất để thêm @request.env["devise.mapping"] = Devise.mappings[:user] để trước của bạn (: mỗi). (Lưu ý bạn có thể làm điều này trong cấu hình của bạn nếu bạn không muốn làm điều này cho mỗi bộ điều khiển).


Đối với phần current_user, chắc chắn rằng bạn có một mô hình User, nơi bạn gọi devise

class User < ActiveRecord::Base 
    # call devise to define user_signed_in? and current_user 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :confirmable 
    # though you don't have to include all these modules 
end 

lập mưu sử dụng các cuộc gọi trong mô hình tài khoản để xác định user_signed_in?current_user trong bộ điều khiển của bạn. Lý do là nếu bạn có:

class Admin < ActiveRecord::Base 
    devise 
end 

sau đó lập mưu sẽ có phương pháp admin_signed_in?current_admin xác định.

+0

cảm ơn sự giúp đỡ của bạn. Tôi đã thêm Devise :: TestHelpers - nó không tạo ra sự khác biệt:/Mô hình người dùng của tôi thực hiện cuộc gọi. Tôi có thể lưu trữ dự án của tôi trên git hub - nó chỉ mới bắt đầu để nó không thực sự có nhiều mã trong đó ... – Karan

+0

https://github.com/karangb/smads/ – Karan

+0

nếu 'current_user' là nil, nó cũng có thể chỉ ra không có người dùng nào đăng nhập (cho vấn đề thứ 2). – ronalchn

8

Nếu bạn bao gồm các module Confirmable trong mô hình User của bạn (hoặc mô hình devise-authenticatable khác), sau đó kiểm tra @user bạn tạo phải được xác nhận cho sign_in có hiệu lực:

before :each do 
    @user = FactoryGirl.create :user 
    @user.confirm! 
    sign_in @user 
end 

(tôi thấy rằng Đây không phải là vấn đề của bạn, nhưng có lẽ một độc giả khác sẽ được hưởng lợi từ nó.)

+0

Cảm ơn vì điều này, tôi đã xé toạc ra nghe cố gắng tìm ra lý do tại sao 'sign_in' không hoạt động trong các thử nghiệm của tôi. – jessewmc

+0

FYI dành cho độc giả: 'xác nhận!' đã không được chấp nhận; bạn nên sử dụng 'xác nhận' thay thế. – rbonick

+0

@rbonick Tôi không thể nhận được 'xác nhận!' Hoặc '' xác nhận' để hoạt động. Tôi lấy toàn bộ dòng và các thử nghiệm của tôi vẫn đi qua mặc dù sử dụng câu trả lời * này *. Tôi không biết phải làm gì. Điều đó có ổn không? – mikelovelyuk

0

Tôi gặp phải vấn đề này khi cố gắng kiểm tra điểm cuối SSO mà tôi đang viết đang tạo một phiên cho người dùng.Vì nó chỉ áp dụng cho một thử nghiệm, tôi chỉ cần thêm khối sau trước khi thử nghiệm

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