Node.js 用誓言测试猫鼬模型

Node.js 用誓言测试猫鼬模型,node.js,coffeescript,mongoose,vows,Node.js,Coffeescript,Mongoose,Vows,对于整个node.js社区来说都是新手,我在第一个应用程序的单元测试中遇到了麻烦。问题是它们通过了,但它们从未在回调中实际运行断言。据我所知,mongoose(我用来与MongoDB对话的库)使用回调来处理它的API。在我的誓言测试中,这些回电似乎不会被解雇。例如: vows = require 'vows' assert = require 'assert' mongoose = require 'mongoose' ProjectSchema = new Schema name: St

对于整个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

你知道我做错了什么吗?

这不是誓言的工作方式。誓言不能是异步的。您应该使用子主题进行异步测试

伪代码(我不会写CS)


正如您所看到的,您创建了一个新的上下文,其中包含一个执行异步活动的主题。然后,您可以声明有关异步活动返回的数据的内容。

我看到的一个问题是
topic.save
可能是指
topic.save()
。另一个更严重的问题是,您需要使用Vows的this.callback来进行异步测试;见雷诺斯的回答


您还需要知道,当Vows获得任何返回值时(除了
未定义的
,这相当于不返回任何内容),它将结束测试。由于CoffeeScript的隐式返回,这意味着您必须非常小心。(我支持无返回值函数的备用
-/>
语法;请参阅。)

+1。我看到的代码中唯一的问题是,应该在每个函数的末尾添加一个显式的
return
。如果
Project.findById
返回任何内容,则会返回到誓言中,这将造成严重破坏。引用:“使用
这个回调的主题不能返回任何东西。”@TrevorBurnham psh,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
}