2012-09-01 15 views
9

Nedense, işe yarayan bir yardımcı yöntem işareti alamıyorum. current_user boş kalmaya devam ediyor. Sorunun ne olabileceğine dair bir fikrin var mı?Devise Test Yardımcısı - sign_in çalışmıyor

Testi:

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 

Uygulama: Herhangi bir yardım takdir

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 

. Teşekkürler!

cevap

8

Bunu çözdüğünüze göre kodunuza göre karar verin. Bunu daha önce de yaşadım ve bir sebepten dolayı her seferinde beni uyandırıyor.

Denetleyici özellikleri için rspec/raylar iskelesi Devise :: TestHelpers ile birlikte çalışmaz.

get :index, {}, valid_session 

valid_session çağrı Devise kurar oturumu şeyler üzerine yazar. Bunu kaldır:

get :index, {} 

Bu işe yaramalıdır!

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

(Görüyorum: Eğer (veya diğer araçları-authenticatable modeli) User modelinde Confirmable modülü eklerseniz sign_in geçerli olması için

+0

yup, sorun buydu! Teşekkürler! :) – Karan

+1

İlk başta bunun işe yaramadığını düşündüm çünkü bir 'pry' hata ayıklama oturumunda denedim ve başarısız oldu. Gözetlemeden ve ayarlanmasından sonra, o zaman benim için çalıştı. –

+0

Tam olarak hangi dosyadan bahsediyorsunuz? – d34th4ck3r

5

Spesifikasyon için include Devise::TestHelpers'a dikkat edin. Benim Spec/spec_helper.rb yılında, çok kolay hale getirmek için, ben vardır: otomatik olarak tüm denetleyici özellikleri adına içerir

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

. (: Her)

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

Bu sizin daha önce hiç @request.env["devise.mapping"] = Devise.mappings[:user] eklemek muhtemelen en iyisi:

Ayrıca, işe sign_in almak için yapmanız gerekir. (Bunu, her denetleyici için yapmak istemiyorsanız, bunu yapılandırmada yapabilirsiniz).


current_user kısmı için, size 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 

tasarlamak sizin denetleyicileri içinde user_signed_in? ve current_user tanımlamak için kullanıcı modeli aramayı kullanan dediğimiz bir modeli User, olduğundan emin olun.

class Admin < ActiveRecord::Base 
    devise 
end 

sonra Devise yöntemleri admin_signed_in? ve tanımlanmış current_admin sahip olacaktır: nedeni varsa olmasıdır.

+0

yardımlarınızdan önce eklemem gerekiyor. Devise :: TestHelpers'ı ekledim - fark yaratmadı:/Kullanıcı modelim devise çağrısı yapıyor. Projemi git hub üzerinde barındırabilirim - yeni başladı, bu yüzden gerçekten çok fazla kodu yok ... – Karan

+0

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

+0

Eğer current_user' nil ise, Hiçbir kullanıcının oturum açmamış olması (2. problem için). – ronalchn

8

, ardından oluşturmak testi @user teyit edilmesi gerekir Bu sizin sorununuz değildi, ama belki de başka bir okuyucu bundan fayda sağlayacaktır.)

+0

Bunun için, testlerimde 'sign_in' neden çalışmadığını anlamaya çalışıyorum. Okuyucular için – jessewmc

+0

FYI: 'onaylayın!' kullanımdan kaldırıldı; bunun yerine 'onayla' kullanmalısınız. – rbonick

+0

@rbonick Ya işe yaramadı ya da teyit edemedim. Bütün çizgiyi çıkardım ve testlerim hala * bu * cevabı kullanarak geçiyor. Ne yapacağımı bilemiyorum. Bu yapmak için uygun mu? – mikelovelyuk

0

Yazdığım bir SSO uç noktasının bir kullanıcı için oturum oluşturduğunu test etmeye çalışırken bu problemle karşılaştım.Sadece bir sınamaya uygulandığından, yalnızca şu bloğumuzu testim