Rspec-core: Jalankan spesifikasi yang sama beberapa kali dengan filter yang berbeda

Dibuat pada 8 Okt 2011  ·  3Komentar  ·  Sumber: rspec/rspec-core

_Disclaimer: Permintaan ini secara khusus berasal dari melakukan tes penerimaan JavaScript dengan Capybara. Meskipun saya dapat melihat kasus penggunaan untuk situasi lain._

Semua aplikasi saya dikodekan sehingga mereka bekerja dengan baik dengan JS dimatikan, tetapi dengan JS diaktifkan _on_, Anda mendapatkan banyak lonceng dan peluit yang bagus untuk membuat pengalaman pengguna lebih menyenangkan. Karena itu, dari sudut pandang pengguna, interaksi pada sebagian besar hal adalah identik; namun saya ingin menguji apakah itu berfungsi baik w/ dan w/o JS.

Yang ingin saya lakukan adalah mengatur semacam flag untuk memberi tahu RSpec untuk menjalankan spesifikasi yang sama dua kali dengan setiap set filter. Sesuatu seperti:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

Saya tahu ini dapat diselesaikan dengan contoh yang dibagikan tetapi kode yang dihasilkan tidak terlalu elegan.

Ini juga dapat digunakan jika Anda ingin menguji tanpa JS (Uji rak) dengan JS di Firefox (Selenium) dan dengan JS di Webkit (capybara-webkit) seperti ini:

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

Saya juga membayangkan cara menggunakan filter khusus untuk menentukan opsi run_with sehingga tidak terlalu bertele-tele seperti:

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

Pikiran? Saya melihat melalui dokumen dan kode dan tidak melihat cara untuk melakukan ini dengan filter.

Komentar yang paling membantu

Filter tidak benar-benar dirancang untuk melakukan ini di luar kotak, tetapi tidak sulit untuk mendapatkan perilaku yang Anda minta tanpa kami membuat perubahan pada RSpec:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

Jika ini adalah pola umum yang Anda butuhkan, Anda dapat membuat metode DSL kecil untuk itu:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

Kemudian Anda dapat menggunakan metode ini seperti:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

Saya pikir ini sangat elegan. Mengubah cara kerja filter untuk melakukan apa yang Anda minta akan menjadi perubahan yang cukup signifikan yang akan menambah beban pemeliharaan di masa mendatang bagi tim RSpec untuk fitur yang saya harapkan jarang digunakan, jadi naluri saya adalah untuk tidak menambahkan ini ke inti .

Karena itu, jika Anda ingin membuat permata rspec-multi-filters yang menyediakan fungsi ini, silakan :).

Semua 3 komentar

Filter tidak benar-benar dirancang untuk melakukan ini di luar kotak, tetapi tidak sulit untuk mendapatkan perilaku yang Anda minta tanpa kami membuat perubahan pada RSpec:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

Jika ini adalah pola umum yang Anda butuhkan, Anda dapat membuat metode DSL kecil untuk itu:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

Kemudian Anda dapat menggunakan metode ini seperti:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

Saya pikir ini sangat elegan. Mengubah cara kerja filter untuk melakukan apa yang Anda minta akan menjadi perubahan yang cukup signifikan yang akan menambah beban pemeliharaan di masa mendatang bagi tim RSpec untuk fitur yang saya harapkan jarang digunakan, jadi naluri saya adalah untuk tidak menambahkan ini ke inti .

Karena itu, jika Anda ingin membuat permata rspec-multi-filters yang menyediakan fungsi ini, silakan :).

@myronmarston seperti biasa, itu hanya ketidaktahuan saya tentang apa yang bisa dilakukan RSpec. Terima kasih telah meluangkan waktu dan mengklarifikasi. Saya pikir ini akan bekerja dengan baik. :)

:+1: luar biasa

Apakah halaman ini membantu?
0 / 5 - 0 peringkat