我有一个文件app.coffee
:
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 :(得分:4)
您正在使用字符串抛出异常而不是抛出错误对象。 throw()
寻找后者。因此,如果你这样做,你的原始代码就可以了:
throw new Error "Dependent task '#{@parent.name}' is not completed."
如果您在CoffeeScript中编写的内容产生无意义的结果,请尝试将其编译为js(或将代码粘贴到try CoffeeScript中。您将看到:
-> task2.complete().should.throw "Dependent task 'wash dishes' is not completed."
汇编为:
(function() {
return task2.complete().should["throw"]("Dependent task 'wash dishes' is not completed.");
});
它只定义一个函数而不执行它。这解释了为什么更改字符串没有区别。我希望有所帮助。
答案 1 :(得分:3)
首先,这是一些好看的Coffeescript。
其次,大卫韦尔登的回答是正确的,你可以改变投掷以实际抛出错误并且有效。
这是你的代码放入一个长文件中,只更改了throw。
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."
摩卡这个混蛋,你很高兴。