Nonaktifkan sekelompok pengujian di rspec?

103

Saya memiliki spesifikasi pengujian yang describeskelas dan dalamnya memiliki variasi contextsmasing-masing dengan berbagai itblok.

Apakah ada cara agar saya dapat menonaktifkan contextsementara?

Saya mencoba menambahkan pending "temporarily disabled"panggilan di bagian paling atas dalam a contextSaya ingin menonaktifkan, dan saya memang melihat sesuatu tentang tertunda ketika saya menjalankan spesifikasi tetapi kemudian terus menjalankan sisa tes.

Inilah yang saya miliki:

describe Something
  context "some tests" do
    it "should blah" do
      true
    end
  end

  context "some other tests" do
    pending "temporarily disabled"

    it "should do something destructive" do
      blah
    end
  end
end

tapi seperti yang saya katakan, itu hanya melanjutkan untuk menjalankan tes di bawah panggilan yang tertunda.

Pencarian membawa saya ke utas milis ini di mana pembuat (?) Dari rspec mengatakan itu mungkin di rspec 2, yang saya jalankan. Saya kira itu berhasil tetapi tidak memiliki efek yang diinginkan untuk menonaktifkan semua tes berikut, yang saya pikirkan ketika saya melihat pendingpanggilan.

Apakah ada alternatif atau saya salah melakukannya?

Jorge Israel Peña
sumber

Jawaban:

166

Untuk menonaktifkan pohon spesifikasi menggunakan RSpec 3 Anda dapat:

before { skip }
# or 
xdescribe
# or 
xcontext

Anda dapat menambahkan pesan dengan lewati yang akan muncul di output:

before { skip("Awaiting a fix in the gem") }

dengan RSpec 2 :

before { pending }
Pyro
sumber
1
Bagaimana Anda bisa melakukannya di blok yang memiliki:describe 'XXXXX' do .... end
p.matsinopoulos
2
@ p.matsinopoulos Tambahkan saja ke baris berikut describe 'XXXXX' do. Bekerja seperti pesona, terima kasih @Pyro!
chesterbr
Solusi yang lebih sederhana daripada filter, +1
dolzenko
Aku cinta kamu. Aku berhutang budi padamu!
Aldo 'xoen' Giambelluca
2
Ini bagus. Anda juga dapat menyertakan pesan setelah 'lewati' yang akan muncul di keluaran.
Jan Hettich
44

Gunakan filter pengecualian . Dari halaman itu: Di spec_helper.rb(atau rails_helper.rb)

RSpec.configure do |c|
  c.filter_run_excluding :broken => true
end

Dalam pengujian Anda:

describe "group 1", :broken => true do
  it "group 1 example 1" do
  end

  it "group 1 example 2" do
  end
end

describe "group 2" do
  it "group 2 example 1" do
  end
end

Saat saya menjalankan "rspec ./spec/sample_spec.rb --format doc"

Kemudian outputnya harus berisi "contoh grup 2 1"

Dan keluarannya tidak boleh berisi "contoh grup 1 1"

Dan hasilnya tidak boleh berisi "contoh grup 1 2"

Robert Speicher
sumber
19

Lihat apa yang Anda pikirkan tentang ini:

describe "something sweet", pending: "Refactor the wazjub for easier frobbing" do
  it "does something well"
  it "rejects invalid input"
end

Saya ingin melihat alasan dengan item saya yang tertunda saat saya menonaktifkan sesuatu untuk "sementara". Mereka berfungsi sebagai komentar kecil / TODO yang disajikan secara teratur daripada terkubur dalam komentar atau contoh / file yang dikecualikan.

Mengubah itke pendingatau xitcepat dan mudah, tetapi saya lebih suka konstruksi hash. Ini memberi Anda dokumentasi setiap proses, merupakan drop-in (tidak mengubah deskripsikan / konteks / itu jadi saya harus memutuskan apa yang akan digunakan lagi nanti), dan dengan mudah dihapus jika keputusan dibuat atau pemblokir dihapus .

Ini bekerja sama untuk contoh kelompok dan individu.

botimer
sumber
Juga saya tidak yakin apakah itu berfungsi sama untuk menggambarkan tetapi dalam tertunda benar-benar menjalankan tes, dan gagal jika tes mulai lulus. Xdescribe (saya kira seperti xit) - tidak menjalankannya.
PL J
1
mengkonfirmasikan bahwa ini bekerja, dengan pending:dan skip:, di rspec 3.6.0. Sepertinya solusi terbaik bagi saya. di rspec3 tertunda masih menjalankan tes, tetapi skiptidak (bagaimanapun Anda menerapkannya skip).
jrochkind
9

yang lainnya. https://gist.github.com/1300152

gunakan xdescribe, xcontext, xit untuk menonaktifkannya.

Memperbarui:

Sejak rspec 2.11, ini termasuk xit secara default. jadi kode baru akan menjadi

# put into spec_helper.rb
module RSpec
  module Core
    module DSL
      def xdescribe(*args, &blk)
        describe *args do
          pending 
        end
      end

      alias xcontext xdescribe
    end
  end
end

Pemakaian

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 
GutenYe
sumber
3

Gunakan menunggu, bukan mendeskripsikan. Jika blok Anda adalah:

context "some other tests" do
  it "should do something destructive" do
    blah
  end
end

Anda dapat melewati seluruh blok dengan:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end
Amir Samakar
sumber
1
describe "GET /blah" do

  before(:each) { pending "Feature to be implemented..." }

  it { expect(page).to have_button("Submit") }
  it { expect(page).to have_content("Blah") }
end
Matt
sumber
0

Hanya untuk menjelaskan apa yang terjadi dengan kode Anda. Termasuk di mana Anda memilikinya, itu hanya akan dievaluasi (dan karenanya dijalankan) ketika file dimuat selama startup. Bagaimanapun Anda membutuhkannya untuk dijalankan saat tes dijalankan. Itulah mengapa jawaban menyarankan untuk meletakkan pending(RSpec 2) atau skip(RSpec 3) ke dalam satu beforeblok.

PhilT
sumber