Bagaimana cara menjalankan hanya tes khusus di Rspec?


159

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

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 .


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


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

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)


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]}}

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.



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


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".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.