ক্যাপিবারা ব্যবহার করে ক্যোয়ারী স্ট্রিং সহ কীভাবে বর্তমান পাথ পান


144

পৃষ্ঠাগুলি ইউআরএলটি এমন কিছু যা /people?search=name আমি যখন current_pathক্যাপাইবার পদ্ধতিটি ব্যবহার করি তখন এটি /peopleকেবল ফিরে আসে ।

current_path.should == people_path(:search => 'name')

কিন্তু এটা বলতে ব্যর্থ

expected: "/people?search=name"
got: "/people"

কীভাবে আমরা এটি পাস করতে পারি? এটি করার কোনও উপায় আছে কি?


10
"/people?search=name" কোন পথ নয়"/people"একটি পথ
আন্দ্রেই বোতলোভ

উত্তর:


212

ক্যাপাইবার আধুনিক সম্মেলনগুলি প্রতিবিম্বিত করতে আমি এই উত্তরটি আপডেট করেছি। আমি মনে করি এটি আদর্শ কারণ এটি গ্রহণযোগ্য উত্তর, এবং সমাধানের সন্ধান করার সময় অনেক লোককে কী বলা হচ্ছে। যা বলা হয়েছিল, বর্তমান পথটি যাচাই করার সঠিক উপায় has_current_path?হ'ল ডকুমেন্টেড হিসাবে ক্যাপিবারার সরবরাহকৃত ম্যাচারটি ব্যবহার করা : এখানে ক্লিক করুন

ব্যবহারের উদাহরণ:

expect(page).to have_current_path(people_path(search: 'name'))

আপনি যেমন নথিতে দেখতে পাচ্ছেন, অন্যান্য বিকল্পগুলি উপলব্ধ। যদি বর্তমান পৃষ্ঠাটি হয় /people?search=nameতবে আপনি কেবল যত্ন নিতে পারেন যে এটি /peopleপৃষ্ঠাতে পরম নির্বিশেষে, আপনি only_pathবিকল্পটি পাঠাতে পারেন :

expect(page).to have_current_path(people_path, only_path: true)

অতিরিক্ত হিসাবে, আপনি যদি পুরো ইউআরএল তুলনা করতে চান:

expect(page).to have_current_path(people_url, url: true)

টম ওয়ালপোলকে এই পদ্ধতিটি দেখানোর জন্য ক্রেডিট।


4
আমার সম্ভবত খুব শীঘ্রই এই বাক্য গঠন প্রয়োজন হবে, আমি কোনও উত্তরাধিকারের প্রয়োগের জন্য পরীক্ষা লিখছি। ব্যবহার current_path.should ==এখনকার জন্য কাজ করছে (যদিও আমাকে স্ট্রিং হিসাবে একটি ট্রেলিং ফরোয়ার্ড-স্ল্যাশ যুক্ত করতে হবে)। আমি সম্ভবত কোড প্রয়োজন কোডের জন্য আপনাকে অগ্রিম ধন্যবাদ জানাচ্ছি।
তাস

3
URI.parse(current_url).request_uriআরও সংক্ষিপ্ত। @ লাস বঙ্কের উত্তর দেখুন।
রিচার্ড জোন্স

ক্যাপিবারা 2.5 হিসাবে, এটি আর সেরা উত্তর নেই is নীচে @ টম-ওয়ালপোলের উত্তর দেখুন।
dkniffin

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

1
নতুন ক্যাপিবারা সংস্করণগুলির ignore_query: trueপরিবর্তে ব্যবহার করুনonly_path: true
আলেকজান্ডার

92

আমি প্যারামিটারগুলির সাথে সম্পূর্ণ url টির তুলনা করতে _url এর সাথে _পথ পদ্ধতিটি প্রতিস্থাপন করেছি।

current_url.should == people_url(:search => 'name')

4
হোস্ট অংশটি আপনি কীভাবে মোকাবেলা করেছেন?
ক্রিস নিকোলা

11
আপনি current_pathক্যাপাইবারার নতুন সংস্করণগুলিতেও ব্যবহার করতে পারেন এবং এর সাথে মেলেও পারেনpeople_path(...)
জেসন স্টার্ক

যখন আমি পথের নাম রাখি না ... আমার কেবল / ব্যবহারকারী / নিবন্ধ আছে ... তবে আমি কীভাবে এটি ব্যবহার করব?
গোপাল এস রাঠোর

যদি এটি কোনও রেন্ডারে ঘটছে, যাতে URL টি এইচটিএমএল পৃষ্ঠা থেকে আলাদা হয়?
বিগপোটাটো

52

আধুনিক সময়ের জন্য কেবল এই প্রশ্নটি আপডেট করা। ক্যাপিবারা 2.5+ ব্যবহার করার সময় কারেন্ট_প্যাথগুলি পরীক্ষা করার জন্য বর্তমানের সেরা অনুশীলনটি হ'ল কারেন্ট_পথ ম্যাথারটি ব্যবহার করা, যা পাথটি পরীক্ষা করতে ক্যাপিবারা অপেক্ষা করার আচরণ ব্যবহার করবে। আপনি যদি অনুরোধ_রি (পথ এবং ক্যোয়ারী স্ট্রিং) এর বিপরীতে চেক করতে চান

expect(page).to have_current_path(people_path(:search => 'name'))  

যদি কেবল পথের অংশটি চাওয়া হয় (ক্যোয়ারীর স্ট্রিং উপেক্ষা করে)

expect(page).to have_current_path(people_path, only_path: true) # Capybara < 2.16
expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16

পুরো ইউআরএল মিলাতে চাইলে

expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
expect(page).to have_current_path(people_url) # Capybara >= 2.16

ম্যাচারের সাথে স্ট্রিং লাগবে যা এর সাথে তুলনা করে == বা একটি রেজেক্সের সাথে মেলে

expect(page).to have_current_path(/search=name/)

4
এই আধুনিক সময়ে এটি উত্তর হিসাবে চিহ্নিত করা উচিত । এটি অনেক অস্পষ্ট সময়সীমার বিষয়গুলি নিরাপদ করবে, ধন্যবাদ!
এক্স 12

1
@ ভানুয়ান আরএসপেক shouldসিনট্যাক্সটিকে হ্রাস করে চলেছে । expect().toআপনার চশমাটি এগিয়ে যাওয়ার চেষ্টা করা উচিত ।
nzifnab

1
only_path: trueএখনignore_query: true
শ্রদ্ধা

18

আমি জানি একটি উত্তর নির্বাচন করা হয়েছে, তবে আমি কেবল একটি বিকল্প সমাধান দিতে চেয়েছিলাম। তাই:

পাখির মতো পথ এবং ক্যোয়ারিং স্ট্রিংয়ের জন্য request.fullpath, আপনি এটি করতে পারেন:

URI.parse(current_url).request_uri.should == people_path(:search => 'name')

আপনি নিজের পরীক্ষার শ্রেণিতে (যেমন ActionDispatch::IntegrationTest) এটির মতো একটি সহায়ক পদ্ধতিও করতে পারেন (যা আমি করেছি):

def current_fullpath
  URI.parse(current_url).request_uri
end

আশাকরি এটা সাহায্য করবে.


1

সম্পাদনা: টিনিনম্বারস যেমন উল্লেখ করেছেন, এটি পোর্ট নম্বর সহ ইউআরএলগুলির জন্য ব্যর্থ। অন্য কারও মতো উজ্জ্বল ধারণা থাকার ক্ষেত্রে এটি এখানে রাখা।

current_url[current_host.size..-1]

গল্ফগুলি ঠিক তেমনি (35 টি অক্ষর) URI.parse(current_url).request_uri, তবে কোনও স্পষ্টত ইউআরআই পার্সিং এর সাথে জড়িত না হওয়ার কারণে এটি সম্ভবত দ্রুত faster

এটিকে ক্যাপিবারাতে যুক্ত করার জন্য আমি একটি অনুরোধ করেছি: https://github.com/jnicklas/capybara/pull/1405


যদি current_urlকোনও পোর্ট নম্বর থাকতে পারে তবে এটি কাজ করে না । যেমন একটি প্রদত্ত current_urlএর http://foo.com:8888/some/path, current_url[current_host.size..-1]সমান হবে :8888/some/path। এছাড়াও, পর্দার আড়ালে current_hostএকই ধরণের URI.parseযুক্তি রয়েছে যা @ এনজিফনাব গৃহীত উত্তরের জন্য সুপারিশ করেছেন।
টিনিং সংখ্যা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.