সমস্ত রুবি পরীক্ষার উত্থাপন: শূন্যপদের জন্য অপরিজ্ঞাত পদ্ধতি 'প্রমাণীকরণ': নীলক্লাস


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

এই প্রশ্নের উত্তর টুইটারে @ ম্যাথ্লো ক্লসন দিয়েছেন

@ জেফিহ আপনাকে এখানে বর্ণিত একটি স্পেস / সমর্থন / ডিভাইস.আরবি ফাইল তৈরি করতে হবে https://github.com/plataformatec/devise#test- সহায়তাকারীদের পরীক্ষার সাহায্যকারীদের অন্তর্ভুক্ত করতে # রবি

আবারও একবার ধন্যবাদ.


2
প্রকৃত ইউআরএল (একটি বিট.লাইয়ের পরিবর্তে ) লগইন করুন: শালীন পৃষ্ঠায় ( github.com/plataformatec/devise ), "পরীক্ষা সহায়ক" বিভাগটি দেখুন।
জাবাবা

74

আমি জানি আপনি আরএসপেক ব্যবহার করছেন তবে আপনি এই একই সমস্যাটি নিয়ে চালিয়ে যেতে পারেন Test::Unit। আপনাকে কেবল ছদ্মবেশী পরীক্ষার সাহায্যকারীদের যুক্ত করতে হবেtest/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

উপরের উত্তরটি আমার পক্ষে কার্যকর হয়নি (আরএসপেক ৩.১)

আমার জন্য কাজ করে এমন একটি সমাধানের জন্য https://stackoverflow.com/a/21166482/1161743 দেখুন ।

ভেরিয়েবল সেট আপ করার আগে আপনাকে একটি বেনামে ব্যবহারকারী লগ আউট করতে হবে:

before :each do
  sign_out :user
end

1
এছাড়াও, পরীক্ষা করুন যে আপনি একাধিকবার ডিভাইস :: টেস্টহেল্পারকে অন্তর্ভুক্ত করেননি কারণ এটি সমস্যার কারণ হতে পারে।
জোসেফ সিফার্স

8

আরএসপেক-এ

জেফরি ডাব্লু। উল্লিখিত হিসাবে, উপরে তার উত্তরে -> এটি সমস্ত নিয়ন্ত্রকের কাছে সেট করতে:

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

তবে এটি যদি কেবল একটি স্পেসের সাথে প্রাসঙ্গিক হয় তবে আপনার সমস্ত কন্ট্রোলার স্পেসের জন্য আপনাকে কৌতুকপূর্ণ সাহায্যকারীদের অন্তর্ভুক্ত করার দরকার নেই, আপনি কেবল কোনও নিয়ামককে ব্লকের বর্ণনা দেওয়াতে সেই সাহায্যকারীদের স্পষ্টভাবে অন্তর্ভুক্ত করতে পারেন:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end

2

আমি আমার একটি প্রকল্পে একই ব্যর্থতাগুলি অনুভব করছিলাম। এটি রুবি ২.০.০-পি59,, রেলগুলি ৩.২.২১, আরএসপেক ২.৯৯ ব্যবহার করছে। আমি যখন সমস্ত চশমা এক সাথে চালাই তখন সমস্যা দেখা দেয়। আমি পৃথকভাবে চশমা চালানোর সময়, তারা পাস। আমি আমার স্পেক / স্পেস_হেল্পার.আরবিতে নিম্নলিখিতটি অন্তর্ভুক্ত করেছি:

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

এই স্ট্যাকওভারফ্লো প্রশ্নের উত্তর থেকে অনুপ্রেরণা গ্রহণ করে , আমি আরএসপেক ডিরেক্টরিগুলির বিভিন্ন সংমিশ্রণগুলি একসাথে চালিয়েছি যাগুলি একে অপরের সাথে হস্তক্ষেপ করতে পারে তা জানতে। শেষ পর্যন্ত আমি আবিষ্কার করলাম আমি ফোন করছি:

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.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

দেখে মনে হচ্ছে উত্স কোডে কিছু আপডেট রয়েছে। অ্যাপ্লিকেশন নিয়ন্ত্রণকারী নির্দিষ্ট করে যে একটি হওয়া দরকারauthenticate_user! কোনও অনুরোধের আগে ফিল্টার চালানো দরকার। এই থ্রেডটি ইস্যু নিয়ে কিছু পটভূমি সরবরাহ করে:

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

মূলত, authenticate_user!ফাংশনটি রেল 3 এর একটি অংশ (নতুন deviseবৈশিষ্ট্যটি ব্যবহার করে , যার সম্পর্কে আমি খুব কমই জানি)। অ্যাপ্লিকেশনটি যদি ব্যবহারকারী মডেলটি না খুঁজে পেতে পারে (হয় নাম জায়গার কারণে বা যে কোনও কারণেই) তবে পদ্ধতিটি ব্যর্থ হবে। আপনি যে "এনকি" অ্যাপ্লিকেশনটির সাথে লিঙ্ক করেছেন সেটি এখন একটি রিয়েল 3 অ্যাপ্লিকেশন। এটি রূপান্তরিত হওয়ার সাথে সাথে এটি কয়েকটি ক্রমবর্ধমান বেদনাগুলির মুখোমুখি হতে পারে।


2
এই উত্তরটি প্রায় 99% খাঁটি বাজে।
সর্বাধিক

-20

রুবি আপনাকে বলছে, সেই পদ্ধতিটি এখনও #authenticateডিফেন্ড করা nilহয়নি। আপনি এটি দ্বারা সহজেই করতে পারেন:

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

এবং ত্রুটি চলে যাবে।


1
দয়া করে এটি করবেন না। শূন্য নয়, 90% ক্ষেত্রে এটি একটি বৈধ অবজেক্ট নয়।
টিয়াগো পেজেনিজেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.