วิธีการรันการทดสอบ 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

ไฟล์ Spec:

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

คุณสามารถรันการทดสอบของคุณเช่นบันเดิล exec rspec ./spec/controllers/groups_controller_spec.rb:6 มันรันการทดสอบเฉพาะนี้เท่านั้น ข้อมูลเพิ่มเติมได้ที่นี่: kolosek.com/rails-rspec-setup
Nesha Zoric

bundle exec rspec spec --helpจะให้คำตอบกับคุณ:
โธมัส Decaux

คำตอบ:


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คำสั่งเพื่อรัน spec ด้วยพารามิเตอร์ที่เหมาะสมเพื่อระบุว่า
Michael Durrant

482

ฉันมักจะทำ:

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

ในกรณีที่42แสดงให้เห็นถึงสายของการทดสอบที่ผมต้องการที่จะทำงาน

EDIT1:

คุณสามารถใช้แท็ก ดูที่นี่

แก้ไข 2:

ลอง:

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

ขอบคุณพยายามที่มันไม่ทำงานเมื่อฉัน rake spec /spec/path...:XX ฉันได้รับข้อผิดพลาด /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec 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 spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : ใน `setup ': คุณได้เปิดใช้งาน rspec-core 2.6.2 แล้ว, แต่ Gemfile ของคุณต้องการ rspec-core 2.6.0. พิจารณาใช้ bundle exec (Gem :: LoadError)"
AnApprentice

คุณสามารถลอง "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19" ในกรณีนั้น
muffinista

ผู้บริหารมัดทำงาน แต่ทำไม นั่นเป็นวิธีที่จะหลีกเลี่ยงการแฮ็กหรือไม่?
AnApprentice

11
ไม่ใช่แฮ็คมันทำให้แน่ใจว่าคุณใช้เวอร์ชันเดียวกันกับที่คุณประกาศใน gemfile ของคุณ ในกรณีของคุณเพียงแค่rspecล้มเหลวเนื่องจากรุ่นในระบบของคุณล่าสุดกว่ารุ่นใน gemfile ของคุณ
apneadiving

67

ด้วยเรค:

rake spec SPEC=path/to/spec.rb

(เครดิตไปที่คำตอบนี้ไปลงคะแนนให้เขา)

แก้ไข (ขอบคุณ @cirosantilli): หากต้องการเรียกใช้สถานการณ์หนึ่งโดยเฉพาะภายในข้อมูลจำเพาะคุณต้องระบุรูปแบบการจับคู่ regex ที่ตรงกับคำอธิบาย

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

11
นี่คือคำตอบที่เหนือกว่าเพราะใช้คำสั่ง 'rake spec' ไม่ใช่คำสั่ง 'rspec' นั่นหมายความว่าฐานข้อมูลทดสอบนั้นเริ่มต้นใหม่อย่างถูกต้องในแต่ละครั้ง (ซึ่งจะไม่เกิดขึ้นหากคุณใช้ 'rspec ... ')
jpw

คุณสามารถใช้SPEC=path/to/spec.rb:42เพื่อเรียกใช้การทดสอบในหมายเลขบรรทัดที่กำหนดแม้ว่ามันจะดูเหมือนว่าit_behaves_likeการทดสอบใด ๆจะได้รับการทำงาน
mgold

61

คุณสามารถส่ง regex ไปยังคำสั่ง spec ซึ่งจะรันเฉพาะitบล็อกที่ตรงกับชื่อที่คุณให้

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

2019 อัปเดต: Rspec2 เปลี่ยนจากคำสั่ง 'spec' เป็นคำสั่ง 'rspec'


ขอบคุณฉันพยายาม แต่มีข้อผิดพลาดกับ: $ rake spec spec / controllers / ขาเข้า _mails_controller_spec.rb -e "ควรจะประสบความสำเร็จและคืน 3 รายการ" rake ถูกยกเลิก! (eval): 1: ใน `standard_rake_options ': ข้อผิดพลาดในการคอมไพล์ (eval): 1: ข้อผิดพลาดทางไวยากรณ์ tIDENTIFIER ที่ไม่คาดคิดการคาดการณ์ $ end ควรจะประสบความสำเร็จและส่งคืน 3 รายการ
AnApprentice

อัปเดตด้วยแนวคิดไฟล์ข้อมูลจำเพาะจริงหรือไม่
AnApprentice

หากคุณมีข้อผิดพลาดในการรวบรวมข้อมูลจำเพาะของคุณไม่ใช่ทับทิมที่ถูกต้อง ให้แน่ใจว่าคุณจะไม่ได้หายไปdoหลังจากที่it, contextหรือdescribeการประกาศ
Douglas F Shearer

1
มันคือ "spec" ไม่ใช่ "rake spec"
muffinista

นี่ควรเป็นคำตอบที่ถูกต้องเกี่ยวข้องกับหมายเลขบรรทัดผิดอย่างยิ่ง - กรณีใด ๆ
Eugen Mayer

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เตะเข้าและเรียกใช้การทดสอบทั้งหมดตามปกติ

มันไม่ง่ายและรวดเร็วเหมือนตัวเลือกบรรทัดคำสั่ง - คุณต้องแก้ไขไฟล์สำหรับการทดสอบที่คุณต้องการเรียกใช้ แต่มันทำให้คุณควบคุมได้มากขึ้นฉันรู้สึก


ฉันชอบสไตล์นี้มากเพราะฉันมักจะทำการทดสอบผ่าน Rubymine / intelliJ ฉันชอบวิธีนี้เพราะมันคล้ายกับการใช้ fit / xit ในจัสมิน / ด้วย gulp
wired00

9

@apadadiving คำตอบเป็นวิธีที่เรียบร้อยในการแก้ปัญหานี้ อย่างไรก็ตามตอนนี้เรามีวิธีการใหม่ใน Rspec 3.3 เราสามารถเรียกใช้rspec spec/unit/baseball_spec.rb[#context:#it]แทนที่จะใช้หมายเลขบรรทัด นำมาจากที่นี่:

RSpec 3.3 แนะนำวิธีใหม่ในการระบุตัวอย่าง [... ]

ตัวอย่างเช่นคำสั่งนี้:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] …จะเรียกใช้ตัวอย่างหรือกลุ่มที่ 2 และ 4 ที่กำหนดภายใต้กลุ่มระดับบนสุดที่ 1 ที่กำหนดใน spec / unit / baseball_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

ผลผลิต:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการคุณสามารถปรับแต่ง regex ให้ตรงกับวิธีทดสอบเดี่ยว \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

ให้คุณอยู่ในโครงการ Rails 3 ด้วย rspec 2 จากไดเรกทอรีรากของ Rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

ควรทำงานแน่นอน ฉันเบื่อที่จะพิมพ์ดังนั้นฉันจึงสร้างนามแฝงเพื่อย่อ 'bundle exec rspec' เป็น 'bersp'

'bundle exec' คือการโหลดสภาพแวดล้อมอัญมณีที่แน่นอนที่ระบุในไฟล์อัญมณีของคุณ: http://gembundler.com/

Rspec2 เปลี่ยนจากคำสั่ง 'spec' เป็นคำสั่ง 'rspec'


0

ฉันใช้ gem ยามนี้เพื่อทดสอบอัตโนมัติ มันรันการทดสอบหลังจากสร้างหรือปรับปรุงการดำเนินงานในไฟล์ทดสอบ

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

หรือโดยปกติคุณสามารถรันโดยใช้คำสั่งต่อไปนี้

ข้อมูลจำเพาะ rspec / controllers / groups_controller_spec.rb



0

คุณสามารถใช้ได้

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

หมายเลขบรรทัดควรเป็นหมายเลขบรรทัดของ 'อธิบาย' หรือ 'มัน' เพื่อที่จะเรียกใช้การทดสอบที่มีอยู่ในบล็อกนั้น แต่จะรันทุกบรรทัดถัดจาก line_number

นอกจากนี้คุณสามารถสร้างบล็อกด้วยชื่อที่กำหนดเองและจากนั้นสามารถดำเนินการบล็อกเหล่านั้นเท่านั้น


0

ข้อผิดพลาดทั่วไปอีกประการหนึ่งคือยังคงมีหรืออัพเกรดแอพ Rails รุ่นเก่าเป็น Rails 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 (แต่แน่นอนว่าคุณจะทำให้มันทำงานได้และข้อควรพิจารณาอื่น ๆ )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.