2012-09-22 12 views
8

をアサート:モカ、should.jsと私はファイル<code>app.coffee</code>持っ例外

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 

とファイルが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." 

私はターミナルで次のコマンドを実行した場合:mocha -r should --compilers coffee:coffee-script -R spec私が持っています例外的に「依存するタスク「洗車」が完了していない」と予想していたことを意味する失敗テスト(最後のもの)。しかし「未定義」を得た。

括弧を削除して(-> task2.complete()).should.throwから-> task2.complete().should.throwに変更すると、テストは合格し、例外をスローしないと失敗します。しかし、例外メッセージをランダムなものに変更しても、それはまだ通り過ぎます。私は何か間違っているのですか?メッセージが文字通り "依存するタスク 'ウォッシュディッシュ'が完了していない場合、テストは合格しないでください。"

+0

あなたは確かに '洗面台'は '' 'parent.name'''ですか?私は各テストステップでプロパティを再宣言します。あなたはあなたのテストでbeforeEachを使うことができます。 – vik

+0

@vikうん、それは 'parent.name'です。私はbeforeEach()の各プロパティを再宣言しても同じ問題があります。最終的なアサーションは 'undefined'になります。 – Matthew

答えて

4

エラーオブジェクトをスローする代わりに、文字列で例外をスローしています。 throw()は後者を探します。だから、あなたが行う場合は、元のコードが動作します。

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

あなたがのCoffeeScriptで書く何かが意味をなさない結果を生産している場合は、JSにそれをコンパイルしてみてください(またはtry CoffeeScriptにコードを貼り付けるあなたが表示されます

(function() { 
    return task2.complete().should["throw"]("Dependent task 'wash dishes' is not completed."); 
}); 
だけで関数を定義

と:

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

はにコンパイルされますことをそれを実行しません。これはなぜ文字列を変更しても差がない理由を説明しています。私はそれが助けて欲しい

+0

私の意見:関数本体をラップするために角括弧を追加すると、coffeescriptサンプルがより明確になります。 ( - > task2.complete())should.throw "依存するタスク 'ウォッシュディッシュ'が完了していません。 –

3

まず、これはすばらしい見た目のCoffeescriptです。

第2に、David Weldonは実際にエラーをスローするスローを変更して動作させることができるという彼の答えに正しいです。

ここでは、スローを変更して1つの長いファイルにコードを入れます。

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." 

あなたが行くのはいいですね。

関連する問題