2012-09-22 25 views
8

Tôi có một tập tin app.coffee:Mocha, should.js và khẳng định một ngoại lệ

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 

và một tập tin gọi 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." 

Nếu tôi chạy lệnh này trong terminal: mocha -r should --compilers coffee:coffee-script -R spec Tôi có một kiểm tra thất bại (người cuối cùng) nói rằng nó đã được mong đợi một ngoại lệ "nhiệm vụ phụ thuộc" rửa chén "không được hoàn thành." nhưng có 'không xác định'.

Nếu tôi thay đổi (-> task2.complete()).should.throw thành -> task2.complete().should.throw bằng cách xóa dấu ngoặc đơn, vượt qua kiểm tra và không thành công nếu tôi không loại trừ ngoại lệ. Nhưng nếu tôi thay đổi thông điệp ngoại lệ thành một cái gì đó ngẫu nhiên, nó vẫn đi qua. Tôi có làm điều gì sai? Không nên thử nghiệm chỉ vượt qua nếu thông điệp là nghĩa đen "nhiệm vụ phụ thuộc" rửa chén "không được hoàn thành."?

+0

bạn có chắc là 'rửa chén' là '' 'parent.name''' không? Tôi sẽ redeclare tài sản trong mỗi bước kiểm tra. bạn có thể sử dụng beforeEach trong bài kiểm tra của bạn. – vik

+0

@vik Vâng đó là 'parent.name'. Tôi đã thử redeclaring mỗi tài sản trong beforeEach() và vẫn có cùng một vấn đề. Xác nhận cuối cùng được 'undefined'. – Matthew

Trả lời

4

Bạn đang ném một ngoại lệ với một chuỗi thay vì ném một đối tượng lỗi. throw() tìm kiếm sau. Vì vậy, mã ban đầu của bạn hoạt động nếu bạn làm:

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

Nếu có gì bạn viết trong CoffeeScript được sản xuất kết quả mà làm cho không có ý nghĩa, hãy thử biên dịch nó để js (hoặc dán mã vào try CoffeeScript Bạn sẽ thấy. rằng:

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

biên dịch để:

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

mà chỉ định nghĩa một hàm và không thực hiện nó. Điều này giải thích tại sao thay đổi chuỗi không tạo ra sự khác biệt. Tôi hy vọng rằng sẽ giúp.

+0

ý kiến ​​của tôi: thêm dấu ngoặc vuông để bọc nội dung chức năng, sẽ làm cho mẫu coffeescript rõ ràng hơn: (-> task2.complete()). Should.throw "Nhiệm vụ phụ thuộc 'rửa chén' chưa hoàn thành." –

3

Trước hết, đó là một số Coffeescript đẹp.

Thứ hai, David Weldon là chính xác trong câu trả lời của mình rằng bạn chỉ có thể thay đổi ném để thực sự ném một lỗi và nó hoạt động.

Đây là mã của bạn được đưa vào một tệp dài với cú ném đã thay đổi.

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

Mocha khốn và bạn tốt để đi.