2013-05-22 5 views
12

Dies sollte eine einfache Antwort haben, aber ich habe Mühe, es zu finden (RSpec Dokumentation, EverydayRails Testing mit RSpec, Google-Ergebnisse überprüft). In meinem Modell Spezifikationen wie ich specs Grund Attribute umfassen wie folgt:RSpec 'Expect' Syntax und Idiomatic Attributesp

describe Foo do 
    describe "basic attributes" do 
    before { @foo = create(:foo) } 
    subject { @foo } 

    it { should be_valid } 
    it { should respond_to(:color) } 
    it { should respond_to(:height) } 
    it { should respond_to(:some_other_attribute) } 
    it { should respond_to(:you_get_the_idea) } 
    ... 

ich diese Spezifikationen mag, weil, wenn es irgendeine Art von Fehler in meiner Fabrik und/oder das Modell dieser Angaben helfen Sie mir, es schnell zu lokalisieren.

Ich habe die expect Syntax in alle anderen Spezifikationen eingebaut und ich mag, wie es liest, aber wie man es hier benutzt? Eine Option könnte

expect(@foo).to respond_to(:color) 

sein und ein anderer könnte

expect(it).to respond_to(:color) 

Erstere sein beinhaltet Vervielfältigung, die mit der should Syntax vermieden wird, aber letztere sieht seltsam mir (was nur ich sein könnte).

Ich weiß, dass diese Frage mehr über Stil als Funktionalität * ist, aber wir Ruby-Entwickler sind gewissenhaft in Bezug auf Stil, und ich möchte mich an Standardpraktiken halten und lesbaren, idiomatischen Code haben. Jede Hilfe wird geschätzt. Vielen Dank.

UPDATE: Keine meiner vorgeschlagenen Optionen funktioniert übrigens. Beide werfen undefined method 'expect' Fehler. Jetzt bin ich wirklich verwirrt!

Nachdem ich über den Fehler nachgedacht habe, merke ich, dass es ist, weil die should Spezifikationen oben innerhalb des einzeiligen Blockes sind. Die Verwirrung, wie kann ich dann einen einzeiligen Block mit der Expect-Syntax schreiben? Angesichts dieses Updates geht es in erster Linie um Funktionalität und ich bin gespannt darauf, die Gedanken anderer zu hören.

4/2015 UPDATE

rspec > 3.0 hat noch einen anderen Weg, um diese zu handhaben, hinzugefügt und es klingt wie rspec ~> 4.0 mit der should Syntax entfernt tun. Per Myron Masters:

Einige Benutzer haben sich darüber geärgert, wie sich dies auf die Expect-Syntax bezieht und ob Sie sie weiterhin verwenden können. Es wird auch weiterhin in RSpec 3 (wieder, unabhängig von Ihrer Syntax-Konfiguration) zur Verfügung stehen, aber wir haben auch hinzugefügt eine alternative API, die ein bisschen mehr im Einklang mit der erwarten ist Syntax:

describe Post do 
    it { is_expected.to allow_mass_assignment_of(:title) } 
end 

is_expected ist sehr einfach definiert als expect (subject) und unterstützt auch negative Erwartungen über is_expected.not_to matcher. [...]
In RSpec 3 haben wir die Soll-Syntax beibehalten und sind standardmäßig verfügbar. Sie erhalten jedoch eine Verwarnungswarnung, wenn Sie sie verwenden, ohne sie explizit zu aktivieren. Dies wird den Weg dafür bereiten, dass es standardmäßig in RSpec 4 deaktiviert wird (oder möglicherweise in ein separates Juwel extrahiert wird), während die Verwirrung für Neulinge, die über ein altes Tutorial zu RSpec kommen, minimiert wird.

+0

Können Sie eine Ihrer Spezifikationen mit der Expect-Syntax teilen? – Sun

+0

Diese sind ziemlich einfach und sind in den RSpec-Dokumenten sowie in anderen Quellen. Hier ist ein großartiger Blogbeitrag über die Syntax: http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax. Meine Beispiele sehen im Wesentlichen so aus, aber sie sind in Blöcken (d. H. "Es tut etwas") ... – aceofbassgreg

Antwort

16

Myron Marston, einem der RSpec Committer Kern, erklärt here, die Sie noch

it { should be_cool } 

Wenn Sie die should Syntax deaktiviert haben verwenden sollte, bietet er eine Lösung alias expect_it-it:

RSpec.configure do |c| 
    c.alias_example_to :expect_it 
end 

RSpec::Core::MemoizedHelpers.module_eval do 
    alias to should 
    alias to_not should_not 
end 

in diesem Ort, könnte man dies schreiben als:

describe User do 
    expect_it { to be_valid } 
end 
+0

Wow, toller Fund zu dieser Frage! Außerdem habe ich Myrons Blogpost in einem Kommentar oben verlinkt, so dass es lustig ist, dass Sie seine Antwort auf eine sehr ähnliche Frage gefunden haben. Ich frage mich, ob der One-Liner "sollte" irgendwann veraltet sein wird. Ich habe RSpec nicht konfiguriert, um die "sollte" -Syntax zu deaktivieren, also nehme ich an, ich werde es immer noch in diesem Fall verwenden. Vielen Dank! – aceofbassgreg

+5

Nur um klar zu sein: selbst wenn Sie Dinge konfiguriert haben, um die 'should' Syntax zu deaktivieren, funktioniert die eine Zeile' it {sollte Matcher} 'syntax immer noch: Deaktivieren der' should' Syntax geht es darum, nicht alle Objekte mit Affen zu patchen 'ExampleGroup # sollte immer noch funktionieren, da es keine Affen-Patches benötigt. –

4

Ich glaube nicht, dass es eine richtige Antwort auf diese Frage, aber ich habe vor kurzem Umschreiben meine Test-Suiten wegzubewegen ausschließlich aus should und verwenden Sie die expect Syntax, also werde ich meine beiden werfen . Cent entschied ich mich ziemlich viel, weil Myron Marston, die RSpec führen Betreuers, wrote neu zu schreiben:

in Zukunft planen wir, die Standardeinstellungen zu ändern, so dass nur erwarten ist, wenn Sie explizit sollte ermöglichen. Wir können dies bereits mit RSpec 3.0 tun, aber wir möchten den Benutzern viel Zeit geben, um sich damit vertraut zu machen.

er auch commented:

Wir haben keine Pläne jemals entfernen „sollte“ ... aber erwarten weniger gotchas hat, und ist die Syntax I für neue Projekte empfehlen.

ich mit Mark Rushakoff ‚einverstanden Antwort s auch, aber persönlich möchte ich nicht, diese Aliase zu erstellen haben nur eine einzige it -Block Stil Syntax zu halten. Also, Ihr Beispiel mit, wo ich ursprünglich ein Modell spec wie Ihr Beispiel in dieser Form geschrieben:

describe Foo do 
    let(:foo) { create(:foo) } 
    subject { foo } 
    describe "model attributes" do 
    it { should be_valid } 
    it { should respond_to(:color) } 
    it { should respond_to(:height) } 
    it { should respond_to(:some_other_attribute) } 
    it { should respond_to(:you_get_the_idea) } 
    end 
    # ... 
end 

Ich würde jetzt neigen dazu, es zu schreiben:

describe Foo do 
    let(:foo) { create(:foo) } 
    specify "model attributes" do 
    expect(foo).to be_valid 
    expect(foo).to respond_to(:color) 
    expect(foo).to respond_to(:height) 
    expect(foo).to respond_to(:some_other_attribute) 
    expect(foo).to respond_to(:you_get_the_idea) 
    end 
    # ... 
end 

Meine Meinung ist foo dass Referenzierung direkt in expect(foo).to respond_to(:color) ist so viel "Duplizierung" als Verweis auf eine subject indirekt mit it, so bin ich nicht zu viel darüber, und ich bin auf die Art und Weise Erwärmung, die expect Spezifikationen in der Regel lesen. Aber letztendlich denke ich, dass dies nur eine Frage des bevorzugten Schreibstils ist.

+1

Sie haben Recht, dass "Duplizierung" nicht wirklich eine große Sache ist, obwohl für längere Modellnamen mit 'es' viele Zeichen gespeichert werden, besonders wenn es viele Attribute gibt. Danke für eine nachdenkliche Antwort! – aceofbassgreg

+0

Ich sehe, woher du kommst und das ist fair genug. Bei einer ähnlichen Anmerkung möchte ich meine Zeilen innerhalb von 80 Zeichen halten, und wenn Sie eine lange Testzeile haben, während ein 'it' Block mehrere Zeilen zulassen kann, indem Sie die' {'...'} 'in' ändern do ... end', eine 'expect' Anweisung über mehrere Zeilen sieht aus wie' expect (foo) .to \ be_valid' mit 'be_valid' in der nächsten Zeile. Das kann zunächst ein wenig peinlich aussehen, aber ich habe mich daran gewöhnt; wieder, nur persönliche Vorliebe. –

+0

Ich habe das Schreiben mehrzeiligen 'expect' Spezifikationen wie folgt: ' erwarten {\ some.really.long.code \ } .to be_valid' , die ich war idiomatische angenommen, aber vielleicht irrte? ? – aceofbassgreg