微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – Mocha,should.js和断言异常

我有一个文件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 to – > task2.complete().should.throw删除括号,测试通过,如果我不抛出异常则失败.但是,如果我将异常消息更改为随机的消息,它仍然会通过.难道我做错了什么?如果消息字面意思是“依赖任务’洗碗’没有完成,那么测试不应该通过.”?

解决方法

您正在使用字符串抛出异常而不是抛出错误对象. 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.");
});

它只是定义一个函数而不执行它.这解释了为什么更改字符串没有区别.我希望有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐