Rspec-core: Führen Sie dieselbe Spezifikation mehrmals mit verschiedenen Filtern aus

Erstellt am 8. Okt. 2011  ·  3Kommentare  ·  Quelle: rspec/rspec-core

_Haftungsausschluss: Diese Anfrage stammt speziell aus der Durchführung von JavaScript-Akzeptanztests mit Capybara. Obwohl ich Anwendungsfälle für andere Situationen sehen kann._

Alle meine Anwendungen sind so codiert, dass sie mit deaktiviertem JS gut funktionieren, aber wenn JS _an_ ist, erhalten Sie viele nette Schnickschnack, um die Benutzererfahrung angenehmer zu machen. Aus diesem Grund sind die Interaktionen der meisten Dinge aus der Sicht des Benutzers identisch; Ich möchte jedoch testen, dass es sowohl mit als auch ohne JS funktioniert.

Ich möchte in der Lage sein, eine Art Flag zu setzen, um RSpec anzuweisen, dieselbe Spezifikation zweimal mit jedem Filtersatz auszuführen. Etwas wie:

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

Ich weiß, dass dies mit gemeinsamen Beispielen erreicht werden kann, aber der resultierende Code ist nicht sehr elegant.

Es könnte zusätzlich verwendet werden, wenn Sie ohne JS (Rack-Test) mit JS auf Firefox (Selenium) und mit JS auf Webkit (capybara-webkit) wie folgt testen möchten:

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

Ich stelle mir auch eine Möglichkeit vor, benutzerdefinierte Filter zu verwenden, um die run_with Optionen anzugeben, damit es nicht ganz so ausführlich ist, wie zum Beispiel:

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

Die Gedanken? Ich habe die Dokumente und den Code durchgesehen und keine Möglichkeit gefunden, dies derzeit mit Filtern zu tun.

Hilfreichster Kommentar

Filter sind nicht wirklich dafür ausgelegt, dies sofort zu tun, aber es ist nicht schwierig, das gewünschte Verhalten zu erreichen, ohne dass wir Änderungen an RSpec vornehmen:

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

Wenn dies ein gängiges Muster ist, das Sie benötigen, können Sie eine kleine DSL-Methode dafür erstellen:

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

Dann können Sie diese Methode wie folgt verwenden:

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

Das finde ich sehr elegant. Die Funktionsweise von Filtern zu ändern, um das zu tun, was Sie verlangen, wäre eine ziemlich bedeutende Änderung, die dem RSpec-Team einen zukünftigen Wartungsaufwand für eine Funktion hinzufügen würde, von der ich erwarte, dass sie selten verwendet wird .

Das heißt, wenn Sie ein rspec-multi-filters Juwel erstellen möchten, das diese Funktionalität bietet, fühlen Sie sich frei :).

Alle 3 Kommentare

Filter sind nicht wirklich dafür ausgelegt, dies sofort zu tun, aber es ist nicht schwierig, das gewünschte Verhalten zu erreichen, ohne dass wir Änderungen an RSpec vornehmen:

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

Wenn dies ein gängiges Muster ist, das Sie benötigen, können Sie eine kleine DSL-Methode dafür erstellen:

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

Dann können Sie diese Methode wie folgt verwenden:

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

Das finde ich sehr elegant. Die Funktionsweise von Filtern zu ändern, um das zu tun, was Sie verlangen, wäre eine ziemlich bedeutende Änderung, die dem RSpec-Team einen zukünftigen Wartungsaufwand für eine Funktion hinzufügen würde, von der ich erwarte, dass sie selten verwendet wird .

Das heißt, wenn Sie ein rspec-multi-filters Juwel erstellen möchten, das diese Funktionalität bietet, fühlen Sie sich frei :).

@myronmarston wie immer, es war nur meine Unwissenheit darüber, was RSpec tun könnte. Danke für die Zeit und die Aufklärung. Ich denke, das wird gut funktionieren. :)

:+1: genial

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen