2010-12-16 3 views
7

Nach einiger Zeit, Gurke & RSpec BDD zu tun, erkannte ich, dass viele meiner Cucumber-Funktionen nur höhere Ansichtstests sind.Wann sollte ich Views im Gurken- und RSpec-Workflow separat testen?

Wenn ich anfange, mein Szenario zu schreiben, und dann zu RSpec gehe, schreibe ich nie die Ansichtsspezifikationen, da ich nur einen Teil des Szenarios kopieren und einfügen könnte, was eine hässliche Duplikation wäre.

Nehmen Sie dieses Szenario zum Beispiel

Scenario: New user comes to the site 
    Given I am not signed in 
    When I go to the home page 
    Then I should see "Sign up free" 

Ich weiß, dass dies nicht direkt auf die Ansicht Prüfung, sondern separate Ansicht spec Schreiben für die gleiche Sache für mich überflüssig zu überprüfen scheint.

Bin ich näher Gurke falsch? Was genau sollte ich in View Specs testen?

Soll ich schreiben sie für jede einzelne Ansicht, zum Beispiel Testen Ansichten für Aktionen wie

def show 
    @project = current_user.projects.first 
end 

oder soll ich einfach komplexere Ansichten testen?

Antwort

8

Es ist eine weit akzeptierte (und meiner Meinung nach falsche) Gurkenphilosophie, dass Ansichten niemals innerhalb von RSpec getestet werden sollten. Da das Verhalten der Ansicht in Cucumber beschrieben werden kann, sollte das RSpec bei dem bleiben, was es am besten kennt - Models and Controllers.

Ich argumentiere, dass der "menschenlesbare" Aspekt von Cucumber einige Aspekte des Blickfelds wichtig macht. Zum Beispiel finde ich, dass View-Spezifikationen sehr gut funktionieren, wenn parallel mit einem Front-End-Entwickler gearbeitet wird. Wenn ein JavaScript-Entwickler weiß, dass er sich in einen Selektor auf Ihrer Seite einklinken möchte, ist es wichtig, dass Ihre Ansicht diesen Selektor bereitstellt.

Zum Beispiel:

describe 'gremlins/show.html.haml' do 
    context 'given it is after midnight' do 
    it 'has a #gremlin_warning selector' do 
     Time.stub!(:now).and_return(Time.parse '2010-12-16 00:01:00') 
     rendered.should have_selector '#gremlin_warning' 
    end 
    end 

    context 'it is before midnight' do 
    it 'does not have a #gremlin_warning selector' do 
     Time.stub!(:now).and_return(Time.parse '2010-12-16 23:59:00') 
     rendered.should_not have_selector '#gremlin_warning' 
    end 
    end 
end 

Beachten Sie, dass die Spezifikationen beschreiben nicht den Inhalt, sie sind absichtlich kurz, und sie nicht Interaktion Verhalten beschreiben. Da die Ansicht der Teil der Anwendung ist, der sich am meisten ändert, sollten die Ansichtsdaten sparsam verwendet werden.

tl; dr: Ansicht Spezifikationen sind für einen Vertrag an andere Entwickler in Verbindung steht und sollten sparsam verwendet werden (aber dennoch sollte verwendet werden).

+1

Ist der Konsens allgemein, drei Arten von Tests in einer Rails App zu haben: Funktions-/Akzeptanztests in Cucumber und Modell- und Controllertests in RSpec (zusammen mit Ihrem Vorschlag, dass RSpec-View-Tests manchmal nützlich sein können)? –

+1

Ich würde dieser Aussage zustimmen, ja. Gurke behandelt, was klassische Akzeptanztests sind. RSpec behandelt klassische Tests (Controller-ish) und Unit-Tests (Modell-ish). – bobocopy

+0

Nein. Diese sollten in Gurkengeschichten sein. View specs sind zu 100% nutzlos, da der Umfang nicht ausreicht. –

2

Persönlich verwende ich nie View Specs bei der Verwendung von Gurke. Akzeptanztests sind für mich viel sinnvoller, und meine komplexen Ansichten sind in der Regel Javascript-orientiert und können nicht mit den View-Spezifikationen getestet werden.

0

Verwenden Sie keine Ansichtsspezifikationen für irgendetwas, nie. Gurkengeschichten - oder sogar RSpec-Integrationstests - machen das besser. Die Beispiele, die bobocopy gibt, sind gut für den Fall, den er postuliert, aber sie sollten in Gurkengeschichten/Integrationstests gerollt werden, nicht allein gelassen.

Verwandte Themen