整个node.js社区相当新,我在第一个应用程序上遇到单元测试问题。问题是它们通过了,但它们实际上从未在回调中运行断言。据我了解,mongoose(我用来与MongoDB交谈的库)使用回调来处理它的API。在我的誓言测试中,这些回调似乎没有被解雇。一个例子:
vows = require 'vows'
assert = require 'assert'
mongoose = require 'mongoose'
ProjectSchema = new Schema
name: String
Project = mongoose.model 'Project', ProjectSchema
mongoose.connect('mongodb://localhost/testdb');
projectBatch = vows.describe('Project').addBatch
'model attributes':
topic: ()->
new Project()
'should have a name field': (topic)->
topic.name = "some name"
topic.save
console.log "this gets executed just fine"
Project.findById topic.id, (error, project)->
console.log "THIS LINE NEVER RUNS!"
assert.equal "some name", project.name
projectBatch.export module
关于我在这里做错了什么想法?
答案 0 :(得分:2)
这不是誓言的作用方式。誓言不能异步。您应该使用子主题进行异步测试
伪代码(我不能写CS)
topic: () -> new Project()
'should have name': {
'topic': (topic) ->
topic.name = "some name"
topic.save
Project.findById topic.id, this.callback
return;
'that can be saved': (err, proj) ->
console.log "SHOULD RUN"
assert.equal "some name", proj.name
}
正如您所看到的,您创建了一个具有异步活动主题的新上下文。然后,您就异步活动返回的数据发誓。
答案 1 :(得分:1)
我看到的一个问题是topic.save
是无操作的 - 您可能意味着topic.save()
。另一个更严重的问题是你需要使用Vows'this.callback
进行异步测试;见雷诺斯的答案。
您还需要注意,当Vows获得任何返回值(undefined
除外)时结束测试,这相当于不返回任何内容。由于CoffeeScript的隐式返回,这意味着您必须非常小心。 (我记录为支持没有返回值的函数的备用-/>
语法;请参阅issue 899。)