Bagaimana cara menjalankan hanya tes khusus di Rspec?

159

Saya pikir ada cara untuk menjalankan tes hanya dengan label yang diberikan. Adakah yang tahu?

Nathan Long
sumber

Jawaban:

186

Tidak mudah menemukan dokumentasinya, tetapi Anda dapat memberi tag contoh dengan hash. Misalnya.

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

Info lebih lanjut tentang GitHub . (siapa pun yang memiliki tautan yang lebih baik, mohon saran)

(memperbarui)

RSpec sekarang didokumentasikan dengan sangat baik di sini . Lihat bagian --tag opsi untuk detailnya.

Pada v2.6 jenis tag ini dapat diekspresikan lebih sederhana dengan memasukkan opsi konfigurasi treat_symbols_as_metadata_keys_with_true_values, yang memungkinkan Anda melakukannya:

describe "Awesome feature", :awesome do

di mana :awesomediperlakukan seolah-olah itu :awesome => true.

Lihat juga jawaban ini untuk cara mengonfigurasi RSpec agar secara otomatis menjalankan tes 'terfokus'. Ini bekerja sangat baik dengan Guard .

zetetik
sumber
Jadi Anda tidak perlu mencari, tautan langsung ke saran zetetic ada di sini (untuk Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/…
tir38
Kami menambahkan spesifikasi ke suite kami untuk memastikan kode tidak pernah digabungkan dengan fokus: true masih dalam kontrol sumber. gist.github.com/jwg2s/7361603
jwg2s
@ jwg2s Saya menggunakan git hook untuk memblokir commit :focus, yang juga mencegah hal-hal yang tidak diinginkan seperti 'binding.pry , console.log`, dll. dari merayap masuk ke basis kode.
zetetic
1
@Otheus tidak, saya hanya penggemar :) Saya sangat suka apa yang mereka lakukan di Relish, tetapi SO baru saja meluncurkan fitur dokumentasi sendiri, jadi kita mungkin melihat beberapa kompetisi.
zetetic
1
Mungkin Anda bisa mengarahkan saya ke cara dokumentasi yang benar-benar menggambarkan penggunaan dan perilaku aktual rspecprogram :) Karena dokumen Relish tidak.
Otheus
111

Anda dapat menjalankan semua tes yang berisi string tertentu dengan opsi --example (atau -e) :

rspec spec/models/user_spec.rb -e "User is admin"

Saya paling sering menggunakannya.

Jan Minárik
sumber
90

Di Anda spec_helper.rb:

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

dan kemudian pada spesifikasi Anda:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

Anda juga dapat memfokuskan tes dengan 'cocok' atau mengecualikan dengan 'xit', seperti:

fit 'can do so and so' do
    # This is the only test that will run
end
Tom Chapin
sumber
1
Dalam rspec 3.5, ini config.filter_run_when_matchingdan itu bisa bekerja hanya dengan menambahkan :focuscontoh
Ali Ghanavatian
4
Jika 'fokus: benar' tidak sengaja dilakukan, CI Anda akan lulus meskipun tidak menjalankan sebagian besar tes.
Zach
67

atau Anda dapat melewati nomor baris: rspec spec/my_spec.rb:75- nomor baris dapat menunjuk ke satu spec atau konteks / menggambarkan blok (menjalankan semua spesifikasi di blok itu)

Alex Lang
sumber
50

Anda juga dapat merangkai beberapa nomor baris bersamaan dengan titik dua:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

Keluaran:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
Jonathon Batson
sumber
Ini sangat emas! 🙇🏾‍♂️
iGbanam
28

Pada RSpec 2,4 (saya kira) Anda dapat tambahkan sebuah fatau xuntuk it, specify, describedan context:

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#fit-class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#xit-class_method

Pastikan untuk memiliki config.filter_run focus: truedan config.run_all_when_everything_filtered = truedi Anda spec_helper.rb.

Joshua Muheim
sumber
3

Anda juga dapat menjalankan spesifikasi yang focus: truesecara default

spec / spec_helper.rb

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

Maka jalankan saja

$ rspec

dan hanya tes fokus yang akan dijalankan

maka ketika Anda menghapus focus: truesemua tes, jalankan lagi

Informasi lebih lanjut: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters

itsnikolay
sumber
Apakah spec/spec_helper.rbselalu disertakan? Atau hanya jika tidak ada opsi yang diberikan? Mengapa modul tes memiliki require 'spec_helber', dan tidak memiliki kode di atas menghilangkan kemungkinan menjalankan tes tunggal dengan menentukan file? Saya tidak dapat menemukan dokumentasi tentang ini.
Otheus
1
spec_helper.rbselalu disertakan jika Anda memiliki --require spec_helperdi .rspecdalam root proyek.
Kris
1

Anda dapat menjalankan sebagai rspec spec/models/user_spec.rb -e "SomeContext won't run this".

Avijit Majhi
sumber