2012-09-22 2 views
8

Ich habe eine Datei app.coffee:Mokka, should.js und eine Ausnahme behauptet

class TaskList 

class Task 
    constructor: (@name) -> 
     @status = 'incomplete' 
    complete: -> 
     if @parent? and @parent.status isnt 'completed' 
      throw "Dependent task '#{@parent.name}' is not completed." 
     @status = 'complete' 
     true 
    dependsOn: (@parent) -> 
     @parent.child = @ 
     @status = 'dependent' 

# Prepare scope stuff 
root = exports ? window 
root.TaskList = TaskList 
root.Task = Task 

und eine Datei namens test/taskTest.coffee:

{TaskList, Task} = require '../app' 
should = require 'should' 

describe 'Task Instance', -> 
    task1 = task2 = null 
    it 'should have a name', -> 
     something = 'asdf' 
     something.should.equal 'asdf' 
     task1 = new Task 'feed the cat' 
     task1.name.should.equal 'feed the cat' 
    it 'should be initially incomplete', -> 
     task1.status.should.equal 'incomplete' 
    it 'should be able to be completed', -> 
     task1.complete().should.be.true 
     task1.status.should.equal 'complete' 
    it 'should be able to be dependent on another task', -> 
     task1 = new Task 'wash dishes' 
     task2 = new Task 'dry dishes' 
     task2.dependsOn task1 
     task2.status.should.equal 'dependent' 
     task2.parent.should.equal task1 
     task1.child.should.equal task2 
    it 'should refuse completion it is dependent on an uncompleted task', -> 
     (-> task2.complete()).should.throw "Dependent task 'wash dishes' is not completed." 

Wenn ich diesen Befehl im Terminal ausführen: mocha -r should --compilers coffee:coffee-script -R spec Ich habe ein fehlender Test (der letzte), der besagt, dass eine Ausnahme erwartet wurde. "Abhängige Aufgabe, Geschirr spülen" ist nicht abgeschlossen. " aber wurde 'undefiniert'.

Wenn ich (-> task2.complete()).should.throw zu -> task2.complete().should.throw durch Entfernen der Klammern ändern, wird der Test bestanden, und schlägt fehl, wenn ich die Ausnahme nicht auslösen. Aber wenn ich die Ausnahmebedingungsnachricht in etwas zufälliges ändere, übergibt es noch. Mache ich etwas falsch? Sollte der Test nicht bestanden werden, wenn die Nachricht wörtlich "abhängige Aufgabe 'Geschirr spülen' ist nicht abgeschlossen."?

+0

Sind Sie sicher, "Geschirr spülen" ist '' 'parent.name'''? Ich würde Eigenschaften in jedem Testschritt neu deklarieren. Sie könnten vorher in Ihrem Test verwenden. – vik

+0

@vik Ja, es ist 'parent.name'. Ich habe versucht, jede Eigenschaft in beforeEach() neu zu deklarieren und immer noch das gleiche Problem zu haben. Die letzte Behauptung wird "undefiniert". – Matthew

Antwort

4

Sie werfen eine Ausnahme mit einer Zeichenfolge, anstatt ein Fehlerobjekt zu werfen. throw() sucht nach letzterem. So Ihre ursprüngliche Code funktioniert, wenn Sie tun:

throw new Error "Dependent task '#{@parent.name}' is not completed." 

Wenn etwas, das Sie in Coffeescript schreiben wird Ergebnisse produzieren, die keinen Sinn machen, versuchen Sie es zu js Kompilieren (oder den Code in try CoffeeScript einfügen Sie werden sehen. , dass:

-> task2.complete().should.throw "Dependent task 'wash dishes' is not completed." 

kompiliert:

(function() { 
    return task2.complete().should["throw"]("Dependent task 'wash dishes' is not completed."); 
}); 

, die nur eine Funktion definiert, und führt es nicht aus. Dies erklärt, warum das Ändern der Saite keinen Unterschied macht. Ich hoffe das hilft.

+0

meine Meinung: Klammern hinzufügen, um den Funktionskörper zu wickeln, würde die coffeescript Probe klarer machen: (-> task2.complete()). Should.throw "Abhängige Aufgabe 'Geschirr spülen' ist nicht abgeschlossen." –

3

Zunächst einmal, das ist ein gutes Aussehen Coffeescript.

Zweitens ist David Weldon in seiner Antwort richtig, dass Sie nur den Wurf ändern können, um tatsächlich einen Fehler zu werfen, und es funktioniert.

Hier ist Ihr Code in eine lange Datei mit nur dem Wurf geändert.

class TaskList 

class Task 
    constructor: (@name) -> 
     @status = 'incomplete' 
    complete: -> 
     if @parent? and @parent.status isnt 'completed' 
      throw new Error "Dependent task '#{@parent.name}' is not completed." 
     @status = 'complete' 
     true 
    dependsOn: (@parent) -> 
     @parent.child = @ 
     @status = 'dependent' 

# Prepare scope stuff 
root = exports ? window 
root.TaskList = TaskList 
root.Task = Task 

should = require 'should' 

describe 'Task Instance', -> 
    task1 = task2 = null 
    it 'should have a name', -> 
     something = 'asdf' 
     something.should.equal 'asdf' 
     task1 = new Task 'feed the cat' 
     task1.name.should.equal 'feed the cat' 
    it 'should be initially incomplete', -> 
     task1.status.should.equal 'incomplete' 
    it 'should be able to be completed', -> 
     task1.complete().should.be.true 
     task1.status.should.equal 'complete' 
    it 'should be able to be dependent on another task', -> 
     task1 = new Task 'wash dishes' 
     task2 = new Task 'dry dishes' 
     task2.dependsOn task1 
     task2.status.should.equal 'dependent' 
     task2.parent.should.equal task1 
     task1.child.should.equal task2 
    it 'should refuse completion it is dependent on an uncompleted task', -> 
     (-> task2.complete()).should.throw "Dependent task 'wash dishes' is not completed." 

Mokka dieser Bastard und du bist gut zu gehen.

Verwandte Themen