2016-04-19 5 views
6

erwartet ich, dass bestimmte Daten zu machen bin versucht hat durch eine einzige Aktion unverändert bleiben:mehr not_to Änderung Erwartungen in rspec

expect { 
    # running migration and user reload here 
}.not_to change(user, :avatar_url).from(sample_avatar_url).and change(user, :old_avatar).from(nil) 

sample_avatar_url eine Zeichenfolge am Anfang der Spec-Datei definiert ist.

Grundsätzlich möchte ich überprüfen, ob die avatar_url und old_avatar unberührt bleiben von dem, was im expect Block passiert.

Der Ausgang aus dem obigen Code ist:

expect(...).not_to matcher.and matcher nicht unterstützt wird, da es ein wenig eine Mehrdeutigkeit erzeugt. Definieren Sie stattdessen negierte Versionen aller Matchings, die Sie negieren möchten, mitund verwenden Sie expect(...).to matcher.and matcher.

Antwort

11

Das funktioniert nicht, weil es das ist, ob soll nicht bedeuten, die erste Änderung und nicht die zweite ändern nicht Erkennbarkeit ist, oder nicht die erste ändern, aber die zweite ändern. Sie haben ein paar Optionen, um diesen

zu bekommen, da Sie statischen Wertes Überprüfung sind nur ändern

nicht
..run migration and user reload.. 
expect(user.avatar_url).to eq(sample_avatar_url) 
expect(user.old_avatar).to eq nil 

verwenden oder define_negated_matcher einen not_change Matcher

RSpec::Matchers.define_negated_matcher :not_change, :change 
expect { 
    # running migration and user reload here 
}.to not_change(user, :avatar_url).from(sample_avatar_url).and not_change(user, :old_avatar).from(nil) 
+0

es mit dem ersten Beispiel Vereinfachen der Trick funktioniert. Vielen Dank! – abpetkov

+0

Gern geschehen - bitte beachten Sie, dass etwas weniger überprüft wird, da nur geprüft wird, ob ein bestimmter Wert gesetzt ist, nicht, dass er nicht von etwas anderem auf diesen Wert geändert wurde - Wenn das für Ihren Anwendungsfall ausreichend ist. –

+0

Platzieren von 'RSpec :: Matchers.define_negated_matcher (: not_change,: change)' in rails_helper.rb gab meine RSpec superpowers. – Epigene

0

Wie erstellen verwenden in Thomas Antwort gesagt, es funktioniert nicht, weil es nicht klar zu lesen ist, und Sie können einen negierten Matcher erstellen. Eine andere Möglichkeit ist die Verwendung der saharspec gem und ihrer Match-Negation. Hier

ist ein Auszug aus der Readme-Projekt:

Weitere (experimentell) Versuch von define_negated_matcher loszuwerden. dont ist nicht 100% grammatikalisch korrekt, aber kurz und lesbar genug. Es negiert nur angefügten Matcher.

# before 
RSpec.define_negated_matcher :not_change, :change 

it { expect { code }.to do_stuff.and not_change(obj, :attr) } 

# after: no `define_negated_matcher` needed 
require 'saharspec/matchers/dont' 

it { expect { code }.to do_stuff.and dont.change(obj, :attr) } 

So können Sie Ihre Erwartung schreiben, ohne eine negierte Matcher wie folgt zu schaffen:

expect { 
    # running migration and user reload here 
}.to dont.change(user, :avatar_url).from(sample_avatar_url).and 
    dont.change(user, :old_avatar).from(nil) 
Verwandte Themen