Frage Capybara: Testen Sie, dass JavaScript ohne Fehler ausgeführt wird


Ich möchte eine Anfrage-Spezifikation schreiben, die das Laden und die Ausführung von Javascript auf einer bestimmten Seite ohne Fehler überprüft.

Ich weiß, dass ich am Ende meiner JavaScript-Datei etwas zum DOM hinzufügen kann und behaupte, dass dieser Inhalt vorhanden ist, aber das fühlt sich an wie ein Hack und zwingt mich, meinen Code aus Testgründen zu verschmutzen. Ich würde es vorziehen, etwas in der Art von.

visit some_path
page.should succesfully_run_javascript

8
2017-07-24 13:28


Ursprung


Antworten:


Sie können dies mit dem folgenden Code in Ihren Tests erreichen.

page.driver.console_messages.each { |error| puts error }
expect(page.driver.console_messages.length).to eq(0)

Die erste Zeile gibt einen Fehler aus, praktisch, um zu sehen, was vor sich geht. Die zweite Zeile führt dazu, dass der Test fehlschlägt.


4
2017-10-28 10:17



Eine Möglichkeit, die möglicherweise nicht sehr umweltverschmutzend ist, besteht darin, Fehler zu sammeln, indem man etwas wie diesen in den Kopf steckt (bedenken Sie, dass dies jeden Onerror-Handler außer Kraft setzt, den Sie bereits haben):

<script>
    window.errors = [];
    window.onerror = function(error, url, line) {
        window.errors.push(error);
    };
</script>

Sie könnten dann etwas tun wie:

page_errors = page.evaluate_script('window.errors')

und bestätigen, dass das Array leer ist. Sie könnten die Fehler sonst ausgeben ...

Hinweis: Es ist wichtig, den Scriptlet zum Kopf hinzuzufügen (möglicherweise als erstes Scriptlet / Script-Tag), da es eines der ersten ausgeführten Skripts sein muss.


3
2017-08-07 22:28



Ein Problem bei der Verwendung page.driver.console_messages ist, dass es zwischen den Tests nicht klar ist. Wenn Sie also nur bestätigen möchten, dass bei einem bestimmten Test keine Fehler aufgetreten sind, kann die Spezifikation aufgrund eines vorherigen Tests fehlschlagen.

Sie können diese Fehler auf eine bestimmte Spezifikation beschränken, indem Sie die letzte speichern console.log Zeitstempel.

Helfer-Methode:

  def assert_no_js_errors
    last_timestamp = page.driver.browser.manage.logs.get(:browser)
                         .map(&:timestamp)
                         .last || 0

    yield

    errors = page.driver.browser.manage.logs.get(:browser)
                 .reject { |e| e.timestamp > last_timestamp }
                 .reject { |e| e.level == 'WARNING' }

    assert errors.length.zero?, "Expected no js errors, but these errors where found: #{errors.join(', ')}"
  end

Und dann benutze es wie:

  def test_somthing_without_js_errors
    assert_no_js_errors do
      # TODO: Write test
    end
  end

2
2018-06-11 09:25