Sie würden expect ... change
verwenden, die eine bestimmte Methodenaufruf Änderungen zu überprüfen - oder ändert sich nicht - einen anderen Wert. In diesem Fall:
expect { click_button "Create my account" }.not_to change(User, :count)
wird rspec führen die folgenden Funktionen ausführen:
- Run
User.count
und notieren Sie den Wert zurückgegeben. (Dies kann als ein Empfänger und ein Verfahren Name angegeben werden, wie (User, :count)
in Ihrem Beispiel, oder als ein beliebiger Code-Block, wie { User.count }
.
- Run
click_button "Create my account"
, die ein Capybara Methode, die auf einen Link per Mausklick simuliert. ..
- Run
User.count
wieder
- Vergleichen sie die Ergebnisse von # 1 und # 3 Wenn sie sich unterscheiden, versagt das Beispiel Wenn sie gleich sind, dann geht es
Andere Möglichkeiten expect ... change
zu verwenden:..
expect { thing.destroy }.to change(Thing, :count).from(1).to(0)
expect { thing.tax = 5 }.to change { thing.total_price }.by(5)
expect { thing.save! }.to raise_error
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol)
Einige Dokumente sind here.
Wie es ist das ist ein bisschen geheimnisvoll, und es ist überhaupt nicht notwendig zu verstehen, wie es funktioniert, um es zu verwenden. Ein Aufruf an expect
definiert eine Struktur für die Ausführung von rspec, die die eigene angepasste DSL und das System von "Matching" von rspec verwendet. Gary Bernhardt hat eine ziemlich saubere screencast, in der er argumentiert, dass das Geheimnis von rspec tatsächlich aus einer dynamischen Sprache wie Rubin herausfällt.Es ist keine gute Einführung in mit rspec, aber wenn Sie neugierig sind, wie alles funktioniert, könnten Sie es interessant finden.
UPDATE
Nachdem Sie Ihren Kommentar auf eine andere Antwort zu sehen, werde ich ein wenig über die Reihenfolge der Operationen hinzuzufügen. Der nicht intuitive Trick ist, dass es der Matcher (change
in diesem Fall) ist, der alle Blöcke ausführt. expect
hat ein Lambda, not_to
ist ein Alias für should_not
dessen Aufgabe es ist, das Lambda an den Matcher weiterzugeben. Der Matcher ist in diesem Fall , der weiß, dass er einmal sein eigenes Argument ausführen und dann das Lambda ausführen muss, an das es übergeben wurde (das von expect
), dann führe sein eigenes Argument erneut aus, um zu sehen, ob sich die Dinge geändert haben. Es ist schwierig, da die Zeile so aussieht, als würde sie von links nach rechts ausgeführt werden, aber da die meisten Teile nur Blöcke von Code passieren, können sie sie mischen und tun sie in der Reihenfolge, die für den Matcher am sinnvollsten ist.
Ich bin kein Experte für die rspec Interna, aber das ist mein Verständnis der Grundidee.
Dies ist nicht Capybara, es ist RSpec. –
@RyanBigg Danke, habe es gerade korrigiert. – Bedasso