2016-03-15 17 views
6

yılında sıfırdır. Bir yönetici iseniz sadece görünen bir silme bağlantım var. Silme bağlantısının yalnızca yöneticiler için gösterildiğini doğrulamak istediğim bir entegrasyon testine sahibim.Ruby on Rails Pundit en örnein Ben taşlar <code>pundit</code> ve <code>devise</code> kullanıyorum entegrasyon testi

response.body
... 
class ActiveSupport::TestCase 
    ... 
    def log_in_as(user, options = {}) 
    password = options[:password] || 'password' 
    if integration_test? 
     post user_session_path, 'user[email]' => user.email, 'user[password]' => user.password 
    else 
     Devise::TestHelpers.sign_in user 
    end 
    end 

    private 

    # Returns true inside an integration test. 
    def integration_test? 
     defined?(post_via_redirect) 
    end 

end 

tamam görünüyor, ama aslında hiçbir silme bağlantı vardır:

test 'comment delete link shows when it should' do 
    log_in_as @admin 
    get movie_path(@movie) 
    assert_select 'a[href=?]', movie_comment_path(comments(:one), @movie.id) 
end 

test_helper.rb şuna benzer Benim. Geliştirme sunucusunu çalıştırdığımda ve sayfayı kendim ziyaret ettiğimde bir tane var. Bunu, pundit'in nil değeriyle aktarılmakta olduğu current_user numaralı telefona daralttım. bir kapanış olarak belirtmek

class CommentPolicy 
    attr_reader :current_user, :comment 

    def initialize(current_user, model) 
    @current_user = current_user 
    @comment  = model 
    end 

    def create? 
    if @current_user 
     @current_user.member? or @current_user.content_creator? or @current_user.moderator? or @current_user.admin? 
    end 
    end 

    def destroy? 
    if @current_user 
     @current_user == @comment.user or @current_user.moderator? or @current_user.admin? 
    end 
    end 

end 

, ben testlerin varsayılan türü için Raylar 4 için oluşturulacak dan bizim bildiğimiz Raylar 5 yerine denetleyici testlerinin entegrasyon testleri için tercih ettiğini duydum: Bu benim comment_policy.rb olduğunu kontrolörlerimiz. Bu durumda kontrolör testlerinde çalışmak sign_in/sign_out yardımcıları yanı entegrasyon testlerinde çalışmak yapılmamışsa Rayları 5 kullanılırken, devise kutudan daha kullanışlı bir çok bir halt olacaktı. Ama hala'un ne olduğunu bilmeden pundit'un bu sorunu var mı? Denetleyici sınamalarında tüm bunların düzgün çalıştığını varsayalım, çünkü current_user denetleyicilere dağıtıldı mı? Bu konuyla ilgili her türlü ışık çok beğeni topluyor, ancak bu kurulumla çalışmak için entegrasyon testlerini nasıl alacağımı gerçekten bilmek isterim çünkü şu an yazmak istediğim bir milyar var. Tamamen önemli, ancak politikada örnein kullanılarak çözülmesi gereken mu yoksa sadece politikada kullanıcıyı kullanabilirsiniz Değil o

cevap

1

. Bununla ben Github elabs/pundit README göre ben sadece yerine current_user her yerde @user ve user kullanmak demek. Kafamı karıştırırsam README'yi oku.

Ayrıca, current_user için nil, isteğiniz için geçerli bir CSRF belirteciniz olmadığında oluşur. Bunu web sitesinde manuel olarak yaptığınızda, localhost:3000 veya w/e adresine giderek, kimlik bilgilerinizle giriş yolunda yazı yazmadan önce giriş yolunda bir get gerçekleştirirsiniz. Entegrasyon testinde, seansınız için CSRF'yi almak için get'u nerede yaptığınızı görmüyorum.

Bu yardımcı olur umarım !!!

+0

size çok teşekkür CSRF şimdi en azından düzeltmek için biliyorum, benim için bir kök konudur :) benim konu testleri genelde işe eylemlere zaman zaman olur sadece bir hata ilgili olmamasına rağmen iyi. –