एकल RSpec परीक्षण कैसे चलाएं?


306

मेरे पास निम्न फ़ाइल है:

/spec/controllers/groups_controller_spec.rb

टर्मिनल में कौन सी कमांड का उपयोग मैं बस उस युक्ति को चलाने के लिए करता हूं और किस निर्देशिका में कमांड चलाता हूं?

मेरी मणि फ़ाइल:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

विशेष फ़ाइल:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end

आप अपने परीक्षण जैसे बंडल एक्ज़ीक्यूट Rspec ./spec/controllers/groups_controller_spec.rb:6 चला सकते हैं, यह केवल इस विशिष्ट परीक्षण को चलाता है। अधिक जानकारी यहाँ: kolosek.com/rails-rspec-setup
Nesha Zoric

bundle exec rspec spec --helpwil आपको उत्तर देगा:
थॉमस डेकाक्स

जवाबों:


15

निश्चित नहीं है कि यह मधुमक्खी कब तक उपलब्ध है, लेकिन रन फ़िल्टरिंग के लिए एक Rspec कॉन्फ़िगरेशन है - तो अब आप इसे अपने लिए जोड़ सकते हैं spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

और फिर उस ब्लॉक में केवल एक फोकस टैग जोड़ें it, contextया describeचलाने के लिए:

it 'runs a test', :focus do
  ...test code
end

RSpec प्रलेखन:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method


1
इसके लिए बुनियादी ढाँचे को बदलने की आवश्यकता है। और इसे वापस बदलना याद है। मैं यह नहीं करने और सिर्फ उपयोग करने की सलाह दूंगाrspec उचित पैरामीटर के साथ युक्ति को चलाने के लिए कमांड इंगित करें कि कौन सा है
माइकल डुरंट

482

आमतौर पर मैं करता हूं:

rspec ./spec/controllers/groups_controller_spec.rb:42

कहाँ 42परीक्षण मैं चलाना चाहते हैं की लाइन का प्रतिनिधित्व करता है।

EDIT1:

आप टैग का उपयोग भी कर सकते हैं। देखें यहाँ

संपादित करें 2:

प्रयत्न:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42

धन्यवाद की कोशिश की है कि यह काम नहीं करता है जब मैं रेक स्पेक /spec/path...:XX प्राप्त करता हूं तो मुझे त्रुटि मिलती है /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr-bin/ruby -S बंडल निष्पादन rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice

अगर मैं सिर्फ RSPEC का उपयोग करने की कोशिश करता हूं, तो मुझे यह त्रुटि मिलती है: "$ rspec कल्पना / नियंत्रक / group_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler.0.0/lib/bundler/runtime.rb:27 : 'इन सेटअप': आप पहले से ही rspec-core 2.6.2 सक्रिय कर चुके हैं, लेकिन आपके Gemfile को rspec-core 2.6.0 की आवश्यकता है। बंडल निष्पादन का उपयोग करने पर विचार करें। (Gem :: LoadError) "
AnApprentice

आप उस मामले में "बंडल एक्ज़ीक्यूट आरएसपीसी स्पेक / कंट्रोलर्स / ग्रुप्स_कंट्रोलर_स्पेक.आरबी: 19" को
आजमा सकते हैं

बंडल निष्पादन पर काम हुआ लेकिन क्यों? क्या इससे बचने का कोई तरीका हैक है?
AApprentice

11
यह हैक नहीं है, यह सुनिश्चित करता है कि आप अपने मणिफाइल में घोषित समान संस्करण का उपयोग करें। आपके मामले में, यह rspecविफल हो गया क्योंकि आपके सिस्टम का संस्करण आपके जेमाइलाइल में एक से अधिक हाल का है।
माफी

67

रेक के साथ:

rake spec SPEC=path/to/spec.rb

(क्रेडिट इस जवाब पर जाता है । उसे वोट दें।)

EDIT (@cirosantilli के लिए धन्यवाद): कल्पना के भीतर एक विशिष्ट परिदृश्य को चलाने के लिए, आपको विवरण से मेल खाने वाले regex पैटर्न से मेल खाना होगा।

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
यह श्रेष्ठ उत्तर है क्योंकि यह 'रेक स्पेक' कमांड का उपयोग करता है न कि 'आरस्पेक' कमांड का। इसका मतलब है कि परीक्षण डेटाबेस को हर बार ठीक से आरंभीकृत किया जाता है (यदि आप 'rspec ...' का उपयोग नहीं करते हैं)
jpw

आप SPEC=path/to/spec.rb:42दिए गए लाइन नंबर पर परीक्षण चलाने के लिए उपयोग कर सकते हैं , हालांकि ऐसा लगता है कि कोई भी it_behaves_likeपरीक्षण भी चला जाएगा (बग?)।
एमजीओल्ड

61

आप एक regex को कल्पना कमांड पर भेज सकते हैं जो केवल itआपके द्वारा आपूर्ति किए जाने वाले नाम से मेल खाते ब्लॉक चलाएगा ।

spec path/to/my_spec.rb -e "should be the correct answer"

2019 अपडेट: Rspec2 ने 'कल्पना' कमांड से 'rspec' कमांड पर स्विच किया।


धन्यवाद कि मैंने कोशिश की, लेकिन इसके साथ त्रुटियां हैं: $ rake कल्पना युक्ति / नियंत्रकों / आने वाली_मेल_कंट्रोलर_स्पेक .rb -e "सफल होनी चाहिए और 3 आइटम" रेक एब्सर्ड वापस करें! (eval): 1: 'standard_rake_options' में: संकलित त्रुटि (eval): 1: वाक्यविन्यास त्रुटि, अप्रत्याशित tIDENTIFIER, $ अंत की उम्मीद करना सफल होना चाहिए और 3 आइटम वापस करना चाहिए
AnApprentice 24/11

वास्तविक कल्पना फ़ाइल विचारों के साथ अद्यतन?
२०

यदि आपके पास एक संकलन त्रुटि है, तो आपकी कल्पना वैध नहीं है। सुनिश्चित करें कि आप doएक it, contextया describeघोषणा के बाद गायब नहीं हैं ।
डगलस एफ शियरर

1
यह "कल्पना" है, "रेक स्पेक" नहीं।
मफिनिस्ता

यह सही उत्तर होना चाहिए, एक लाइन नंबर से संबंधित गंभीर रूप से गलत है - किसी भी मामले
यूजेन मेयर

27

कई विकल्प हैं:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true

23

विशिष्ट परीक्षण चलाने के लिए मेरा पसंदीदा तरीका थोड़ा अलग है - मैंने लाइनें जोड़ीं

  RSpec.configure do |config|
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end

मेरी spec_helper फ़ाइल के लिए।

अब, जब भी मैं एक विशिष्ट परीक्षण (या संदर्भ, या कल्पना) चलाना चाहता हूं, तो मैं इसमें केवल "फोकस" टैग जोड़ सकता हूं, और अपना परीक्षण सामान्य रूप से चला सकता हूं - केवल केंद्रित परीक्षण (एस) चलेगा। अगर मैं सभी फोकस टैग हटा देता हूं,run_all_when_everything_filtered सभी परीक्षण सामान्य रूप से चलते हैं।

यह कमांड लाइन विकल्प के रूप में बहुत जल्दी और आसान नहीं है - यह आपको उस परीक्षण के लिए फ़ाइल को संपादित करने की आवश्यकता है जिसे आप चलाना चाहते हैं। लेकिन यह आपको बहुत अधिक नियंत्रण देता है, मुझे लगता है।


मैं निश्चित रूप से इस शैली को पसंद करता हूं, क्योंकि मैं आमतौर पर रुबामाइन / इंटेलीज के माध्यम से परीक्षण चला रहा हूं। मैं इस विधि की तरह इसलिए भी कि फिट का उपयोग कर के लिए अपने समान / बाहर निकलें में चमेली / साथ ही सांस
wired00

9

@ उत्तर देने का उत्तर इसे हल करने का एक अच्छा तरीका है। हालाँकि, अब हमारे पास Rspec 3.3 में एक नया तरीका है। हम केवल rspec spec/unit/baseball_spec.rb[#context:#it]एक पंक्ति संख्या का उपयोग करने के बजाय चला सकते हैं । यहाँ से लिया गया :

RSpec 3.3 उदाहरणों की पहचान करने के लिए एक नया तरीका पेश करता है [...]

उदाहरण के लिए, यह आदेश:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … कल्पना करें कि यूनिट / यूनिट / base_spec.rb में परिभाषित प्रथम शीर्ष-स्तरीय समूह के तहत परिभाषित दूसरा और चौथा उदाहरण या समूह चलेगा।

इसलिए ऐसा करने के बजाय rspec spec/unit/baseball_spec.rb:42जहां यह (लाइन 42 में परीक्षण) पहला परीक्षण है, हम परीक्षण के मामले को नस्टेड कैसे कर सकते हैं rspec spec/unit/baseball_spec.rb[1:1]या rspec spec/unit/baseball_spec.rb[1:1:1]इस पर निर्भर करते हैं ।


5

रेल में 5,

मैंने सिंगल टेस्ट फाइल चलाने के लिए इस तरह से इस्तेमाल किया (एक फाइल में सभी परीक्षण)

rails test -n /TopicsControllerTest/ -v

इच्छित फ़ाइल से मिलान करने के लिए वर्ग नाम का उपयोग किया जा सकता है TopicsControllerTest

मेरी कक्षा class TopicsControllerTest < ActionDispatch::IntegrationTest

आउटपुट:

यहां छवि विवरण दर्ज करें

यदि आप चाहते हैं कि आप एकल परीक्षण विधि से मेल खाने के लिए रेगेक्स को ट्विक कर सकते हैं \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

मॉडल के लिए, यह केवल लाइन नंबर 5 पर मामला चलेगा

bundle exec rspec spec/models/user_spec.rb:5

नियंत्रक के लिए: यह केवल लाइन नंबर 5 पर मामला चलेगा

bundle exec rspec spec/controllers/users_controller_spec.rb:5

सिग्नल मॉडल या कंट्रोलर के लिए ऊपर से लाइन नंबर निकालें

सभी मॉडलों पर मामला चलाने के लिए

bundle exec rspec spec/models

सभी नियंत्रक पर मामला चलाने के लिए

bundle exec rspec spec/controllers

सभी मामलों को चलाने के लिए

 bundle exec rspec 

3

अपने प्रोजेक्ट के रूट डायरेक्टरी से कमांड चलाएँ:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45

1

rspec 2 से शुरू करके आप निम्नलिखित का उपयोग कर सकते हैं:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

0

यह देखते हुए कि आप rspec 2 के साथ एक रेल 3 परियोजना पर हैं, रेल रूट निर्देशिका से:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

निश्चित रूप से काम करना चाहिए। मैं टाइपिंग से थक गया, इसलिए मैंने 'bersp' के लिए 'बंडल एग्जिट rspec' को छोटा करने के लिए एक उपनाम बनाया

'बंडल एग्जीक्यूटिव' इतना है कि यह आपकी रत्न फ़ाइल में निर्दिष्ट सटीक रत्न वातावरण को लोड करता है: http://gembundler.com/

Rspec2 ने 'स्पेक' कमांड से 'rspec' कमांड पर स्विच किया।


0

मैं अपने परीक्षण को ऑटो चलाने के लिए इस गार्ड रत्न का उपयोग करता हूं। यह परीक्षण फ़ाइल पर ऑपरेशन बनाने या अपडेट करने के बाद परीक्षण निष्पादित करता है।

https://github.com/guard/guard-test

या आमतौर पर आप निम्नलिखित आदेश का उपयोग करके चला सकते हैं

rspec कल्पना / नियंत्रक / समूह_कंट्रोलर_स्पेक .rb



0

आप उपयोग कर सकते हैं

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

लाइन नंबर 'विवरण' या 'इट्स' लाइनों की लाइन संख्या होनी चाहिए ताकि यह उस विशेष ब्लॉक में मौजूद परीक्षणों को चलाए। इसके बजाय यह line_number के आगे सभी लाइनों को निष्पादित करेगा।

इसके अलावा, आप कस्टम नाम के साथ ब्लॉक बना सकते हैं और फिर केवल उन ब्लॉकों को निष्पादित कर सकते हैं।


0

एक और आम गलती अभी भी एक पुराने रेल एप्लिकेशन को 5+ पर अपग्रेड करने या require 'spec_helper'प्रत्येक परीक्षण फ़ाइल के शीर्ष पर रखने की है । इसे बदल देना चाहिए require 'rails_helper'। यदि आप रेक कार्य ( rake spec) के बीच भिन्न व्यवहार देख रहे हैं और जब आप एकल युक्ति चलाते हैं ( rspec path/to/spec.rb), तो यह एक सामान्य कारण है

सबसे अच्छा समाधान है

1) सुनिश्चित करें कि आप require 'rails_helper'अपनी प्रत्येक कल्पना फ़ाइलों के शीर्ष पर उपयोग कर रहे हैं - पुरानी शैली require 'spec_helper' 2 नहीं) का उपयोग करेंrake spec SPEC=path/to/spec.rb सिंटैक्स का

पुरानी शैली, जो rspec path/to/spec.rbमुझे लगता है कि 2020 में इस समय समुदाय द्वारा आउट-ऑफ-वोग माना जाना चाहिए (लेकिन निश्चित रूप से आपको यह काम करने के लिए मिलेगा, अन्य विचार एक तरफ)

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