सभी रूबी परीक्षण बढ़ाते हुए: शून्य के लिए अपरिभाषित विधि `प्रमाणित ': नीलक्लास


132

मेरे अधिकांश परीक्षण निम्नलिखित उठा रहे हैं और मुझे समझ नहीं आ रहा है कि क्यों। सभी तरीकों से कॉल 'प्रमाणित' त्रुटि को बढ़ाती है। मैंने कोड की जाँच की है यदि "प्रमाणीकरण" नामक एक विधि थी, लेकिन ऐसी कोई विधि नहीं है।

  1) Admin::CommentsController handling GET to index is successful
     Failure/Error: get :index
     undefined method `authenticate!' for nil:NilClass
     # ./spec/controllers/admin/comments_controller_spec.rb:9:in `block (3 levels) in <top (required)>'


  124) PostsController handling GET for a single post should render show template
     Failure/Error: get :show, :year => '2008', :month => '01', :day => '01', :slug => 'a-post'
     undefined method `authenticate' for nil:NilClass
     # ./app/controllers/application_controller.rb:18:in `set_current_user_for_model'
     # ./spec/controllers/posts_controller_spec.rb:131:in `do_get'
     # ./spec/controllers/posts_controller_spec.rb:140:in `block (3 levels) in <top (required)>'

यदि आप अपने स्वयं के परीक्षणों को चलाना चाहते हैं, तो परियोजना को वहां पर पाया जा सकता है => https://github.com/agilepandas/enki

जवाबों:


191

इस सवाल का जवाब ट्विटर पर @MatthewClosson ने दिया है

@jeffehh आप को यहां निर्धारित एक कल्पना / support / devise.rb फ़ाइल बनाने की आवश्यकता https://github.com/plataformatec/devise#test-helpers वसीयत परीक्षण सहायकों #ruby शामिल करने के लिए

एक बार फिर से धन्यवाद।


2
वास्तविक URL (एक bit.ly के बजाय) लॉगिंग: वसीयत पेज (पर github.com/plataformatec/devise ), अनुभाग "टेस्ट सहायकों" देखें।
ज़ब्बा

74

मुझे पता है कि आप Rspec का उपयोग कर रहे हैं, लेकिन आप इसी मुद्दे के साथ चला सकते हैं Test::Unit। तुम बस के लिए devise परीक्षण सहायकों को जोड़ने की जरूरत हैtest/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

उपरोक्त उत्तर मेरे काम नहीं आया (RSpec 3.1)

मेरे लिए काम करने वाले समाधान के लिए https://stackoverflow.com/a/21166482/1161743 देखें ।

चर सेट करने से पहले आपको एक अनाम उपयोगकर्ता को लॉग आउट करना होगा:

before :each do
  sign_out :user
end

1
इसके अलावा, जाँच करें कि आपने डेविस को शामिल नहीं किया है :: TestHelpers कई बार क्योंकि यह समस्या पैदा कर सकता है।
जोसेफ सिफर्स

8

RSpec में

जैसा कि जेफरी डब्ल्यू ने उल्लेख किया है, ऊपर अपने जवाब में -> सभी नियंत्रकों को इसे सेट करने के लिए:

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

हालाँकि, यदि यह सिर्फ एक युक्ति के लिए प्रासंगिक है, तो आपको अपने सभी नियंत्रकों के चश्मे में वसीयत सहायकों को शामिल करने की आवश्यकता नहीं है, आप केवल उन सहायकों को स्पष्ट रूप से शामिल कर सकते हैं जो एक नियंत्रक ब्लॉक का वर्णन करते हैं:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end

2

मैं अपनी एक परियोजना में समान विफलताओं का सामना कर रहा था। यह रूबी 2.0.0-p598, रेल 3.2.21, RSpec 2.99 का उपयोग कर रहा है। जब मैं सभी स्पेक्स को एक साथ चलाता हूं तो समस्या हुई। जब मैंने व्यक्तिगत रूप से चश्मा चलाया, तो वे पास हो गए। मेरे पास मेरी कल्पना / spec_helper.rb में निम्नलिखित शामिल हैं:

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

मैंने प्रत्येक असफल कल्पना फ़ाइल में पहले वर्णन के लिए निम्नलिखित को जोड़ा। इससे समस्या का समाधान नहीं हुआ:

before :each do
  sign_out :user
end

न ही:

after :each do
  sign_out :user
end

इस स्टैकओवरफ्लो प्रश्न के उत्तर से प्रेरणा लेते हुए , मैंने rspec निर्देशिकाओं के विभिन्न संयोजनों को एक साथ चलाया, ताकि यह पता लगाया जा सके कि कौन-कौन से एक-दूसरे के साथ हस्तक्षेप कर सकते हैं। अंत में मुझे पता चला कि मैं फोन कर रहा था:

before() do #note no :each passed to before
  :
end

जब मैंने इस की सभी घटनाओं को बदल दिया:

before(:each) do
  :
end

विफलता के बिना पारित किए गए सभी चश्मा:

undefined method `authenticate' for nil:NilClass

मुझे उम्मीद है कि यह दूसरों की मदद के लिए है।


0

यदि आप दृश्य युक्ति के साथ काम कर रहे हैं, तो आप रुक सकते हैं current_user। यह प्रभावी रूप current_userसे जो कुछ भी लौटाया गया है उसके साथ आपके दृष्टिकोण से बुलाए गए सहायक को ओवरराइड करता है। यहाँ कैसे rspec-3.2.3 के साथ है:

RSpec.describe "projects/show", type: :view do
  before(:each) do
    allow(view).to receive(:current_user).and_return(FactoryGirl.create(:user))
  end

  it "renders attributes in <p>" do
    render
    expect(rendered).to match(/whatever you want to regex match here/)
  end
end

-3

ऐसा लगता है कि स्रोत कोड में कुछ अपडेट हैं। ApplicationController निर्दिष्ट करता है कि authenticate_user!किसी भी अनुरोध से पहले फ़िल्टर चलाने की आवश्यकता है । यह धागा इसके साथ मुद्दों पर कुछ पृष्ठभूमि प्रदान करता है:

http://groups.google.com/group/plataformatec-devise/browse_thread/thread/f7260ebe2d9f7316?fwc=1

अनिवार्य रूप से, authenticate_user!फ़ंक्शन रेल 3 का हिस्सा है (नई deviseसुविधा का उपयोग करके , जिसके बारे में मुझे कम जानकारी है)। यदि एप्लिकेशन उपयोगकर्ता मॉडल नहीं ढूँढ सकता है (या तो नामस्थान समस्याओं या जो भी कारण है) तो विधि विफल हो जाएगी। आपके द्वारा लिंक किया गया "enki" अनुप्रयोग अब एक रेल 3 अनुप्रयोग है। यह कुछ बढ़ते दर्द का अनुभव कर सकता है क्योंकि यह खत्म हो जाता है।


2
यह उत्तर लगभग 99% शुद्ध बकवास है।
अधिकतम

-20

रूबी आपको बता रही है, उस विधि #authenticateको nilअभी तक परिभाषित नहीं किया गया है । आप इसे आसानी से कर सकते हैं:

def nil.authenticate!
  puts "Bingo! Nil is now authentic!"
end

और त्रुटि दूर हो जाएगी।


1
कृपया ऐसा न करें। नील शून्य है, 90% मामलों में एक वैध वस्तु नहीं है।
टियागो पेकजेनज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.