অনুরোধ বিশ্বে স্ট্যাবিং প্রমাণীকরণ


84

একটি অনুরোধ বিশ্লেষণ লেখার সময়, আপনি কীভাবে সেশন এবং / অথবা স্টাব নিয়ন্ত্রক পদ্ধতি সেট করবেন? আমি আমার ইন্টিগ্রেশন টেস্টগুলি - আরএসপেক / অনুরোধগুলিতে প্রমাণীকরণের চেষ্টা করতে চাইছি

এখানে একটি পরীক্ষার উদাহরণ

require File.dirname(__FILE__) + '/../spec_helper'
require File.dirname(__FILE__) + '/authentication_helpers'


describe "Messages" do
  include AuthenticationHelpers

  describe "GET admin/messages" do
    before(:each) do
      @current_user = Factory :super_admin
      login(@current_user)
    end

    it "displays received messages" do
      sender = Factory :jonas
      direct_message = Message.new(:sender_id => sender.id, :subject => "Message system.", :content => "content", :receiver_ids => [@current_user.id])
      direct_message.save
      get admin_messages_path
      response.body.should include(direct_message.subject) 
    end
  end
end

সহায়ক:

module AuthenticationHelpers
  def login(user)
    session[:user_id] = user.id # session is nil
    #controller.stub!(:current_user).and_return(user) # controller is nil
  end
end

এবং প্রয়োগকারী নিয়ন্ত্রণকারী যা প্রমাণীকরণ পরিচালনা করে:

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :current_user
  helper_method :logged_in?

  protected

  def current_user  
    @current_user ||= User.find(session[:user_id]) if session[:user_id]  
  end

  def logged_in?
    !current_user.nil?
  end
end

কেন এই সংস্থানগুলিতে অ্যাক্সেস করা সম্ভব হচ্ছে না?

1) Messages GET admin/messages displays received messages
     Failure/Error: login(@current_user)
     NoMethodError:
       undefined method `session' for nil:NilClass
     # ./spec/requests/authentication_helpers.rb:3:in `login'
     # ./spec/requests/message_spec.rb:15:in `block (3 levels) in <top (required)>'

উত্তর:


101

একটি অনুরোধ স্পেক চারপাশে একটি পাতলা মোড়ক ActionDispatch::IntegrationTest, যা নিয়ামক চশমা (যা মোড়ানো ActionController::TestCase) এর মতো কাজ করে না । সেশন পদ্ধতি উপলভ্য থাকলেও, আমি মনে করি এটি সমর্থন করে না (যেমন এটি সম্ভবত সেখানে আছে কারণ অন্য কোনও ইউটিলিটির জন্য অন্তর্ভুক্ত হওয়া কোনও মডিউলও সেই পদ্ধতিতে অন্তর্ভুক্ত থাকে)।

ব্যবহারকারীদের অনুমোদনের জন্য আপনি যে কোনও ক্রিয়া ব্যবহার করে পোস্ট করে লগ ইন করার পরামর্শ দিই। আপনি যদি সমস্ত ব্যবহারকারীর জন্য পাসওয়ার্ডটি 'পাসওয়ার্ড' (উদাহরণস্বরূপ) করেন তবে আপনি এই জাতীয় কিছু করতে পারেন:

ডিএফ লগইন (ব্যবহারকারী)
  পোস্ট লগইন_পথ,: লগইন => ইউজারআলগিন, পাসওয়ার্ড => 'পাসওয়ার্ড'
শেষ

4
ধন্যবাদ ডেভিড এটি দুর্দান্ত কাজ করে, তবে এই সমস্ত অনুরোধগুলি করা একটু ওভারকিল বলে মনে হচ্ছে?
জোনাস নীলসন

19
যদি আমি মনে করি এটি ওভারকিল ছিল, তবে আমি এটির সুপারিশ করতাম না :)
ডেভিড চেলিমস্কি

6
এটি নির্ভরযোগ্যভাবে করার সহজতম উপায়। ActionDispatch::IntegrationTestপ্রকৃত ব্রাউজারগুলি ব্যবহার না করেই এক বা একাধিক ব্যবহারকারীকে ব্রাউজারগুলির মাধ্যমে কথোপকথন করার জন্য নকশা করা হয়েছে। একক উদাহরণের মধ্যে একাধিক ব্যবহারকারীর (যেমন অধিবেশন) এবং একাধিক নিয়ামক রয়েছে এবং সেশন / নিয়ামক অবজেক্টগুলি হ'ল শেষ অনুরোধে ব্যবহৃত হয়। একটি অনুরোধ করার আগে আপনার কাছে তাদের অ্যাক্সেস নেই।
ডেভিড চেলিমস্কি

17
আমাকে page.driver.postক্যাপাইবার সাথে ব্যবহার করতে হবে
ইয়ান ইয়াং

ক্যাপাইবার page.driver.postজোনাস নিক্লাস এবং টেস্টিং এপিআই অনুসারে @ ইয়ানইয়াং এন্টিপ্যাটার্ন হতে পারে )
এপিজিন

61

ডিভাইস ব্যবহারকারীদের জন্য নোট ...

BTW, @David Chelimsky এর উত্তর যদি আপনি ব্যবহার করছেন একটু টোয়েকিং প্রয়োজন হতে পারে উইল । আমি আমার সংহতকরণ / অনুরোধ পরীক্ষায় যা করছি ( এই স্ট্যাকওভারফ্লো পোস্টকে ধন্যবাদ ):

# file: spec/requests_helper.rb

# Rails 6
def login(user)
  post user_session_path, params: {
    user: {
      email: user.email, password: user.password
    }
  }
  follow_redirect!
end

# Rails 5 or older
def login(user)
  post_via_redirect user_session_path, 'user[email]' => user.email, 'user[password]' => user.password
end

4
যখন আমি তখন আরএসপিপ মডেল স্পেসে 'লগইন ইউজার 1' ব্যবহার করি, তখন আমি # <আরএসপেক :: কোর:
jpw

4
এই অনুমান আপনি devise_for :usersমধ্যে config/routes.rbফাইল। আপনি যদি অন্যরকম কিছু নির্দিষ্ট করে থাকেন তবে আপনাকে সেই অনুযায়ী আপনার কোডটি টুইট করতে হবে।
নির্ভীক_ফুল

এটি আমার পক্ষে কাজ করেছে আমাকে এটিকে কিছুটা সংশোধন করতে হয়েছিল। আমি পরিবর্তন 'user[email]' => user.emailকরতে 'user[username]' => user.usernameযেহেতু আমার অ্যাপ্লিকেশন ব্যবহার করে একটি লগইন পরিবর্তে ইমেল হিসাবে ব্যবহারকারীর নাম।
ওয়েবদেবগুই

3

এফডাব্লুআইডাব্লু, আমার টেস্ট :: ইউনিট পরীক্ষাগুলি আরএসপিকে পোর্ট করার ক্ষেত্রে, আমি আমার অনুরোধের চশমাগুলিতে একাধিক (নকশা) সেশনে লগইন করতে সক্ষম হতে চাই। এটি কিছু খনন করেছে, কিন্তু এটি আমার জন্য কাজ করেছে। রেলগুলি ৩.২.১৩ এবং আরএসপেক ২.১.0.০ ব্যবহার করে।

# file: spec/support/devise.rb
module RequestHelpers
  def login(user)
    ActionController::IntegrationTest.new(self).open_session do |sess|
      u = users(user)

      sess.post '/users/sign_in', {
        user: {
          email: u.email,
          password: 'password'
        }
      }

      sess.flash[:alert].should be_nil
      sess.flash[:notice].should == 'Signed in successfully.'
      sess.response.code.should == '302'
    end
  end
end

include RequestHelpers

এবং...

# spec/request/user_flows.rb
require 'spec_helper'

describe 'User flows' do
  fixtures :users

  it 'lets a user do stuff to another user' do
    karl = login :karl
    karl.get '/users'
    karl.response.code.should eq '200'

    karl.xhr :put, "/users/#{users(:bob).id}", id: users(:bob).id,
      "#{users(:bob).id}-is-funny" => 'true'

    karl.response.code.should eq '200'
    User.find(users(:bob).id).should be_funny

    bob = login :bob
    expect { bob.get '/users' }.to_not raise_exception

    bob.response.code.should eq '200'
  end
end

সম্পাদনা : নির্দিষ্ট টাইপ


-1

আপনি খুব সহজেই অধিবেশন stub করতে পারেন।

controller.session.stub(:[]).with(:user_id).and_return(<whatever user ID>)

সমস্ত রুবি বিশেষ অপারেটর প্রকৃতপক্ষে পদ্ধতি। কলিং 1+1এর সমান 1.+(1), যার অর্থ +কেবল একটি পদ্ধতি। একইভাবে, session[:user_id]পদ্ধতি কলিং হিসাবে একই []উপর sessionহিসাবে,session.[](:user_id)


এটি একটি যুক্তিসঙ্গত সমাধান বলে মনে হচ্ছে।
সুপারলুমিনিয়ারি

4
এটি কোনও অনুরোধের কাজগুলিতে কাজ করে না, তবে কেবল একটি নিয়ামক বিশেষে।
মাছিসুজি

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