3

对整个 node.js 社区来说相当新,我在我的第一个应用程序上进行单元测试时遇到了问题。问题是它们通过了,但它们实际上从未在回调中运行断言。据我了解,猫鼬(我用来与 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

关于我在这里做错了什么的任何想法?

4

2 回答 2

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
}

如您所见,您使用执行异步活动的主题创建了一个新上下文。然后,您就异步活动返回的数据发誓。

于 2011-08-31T17:28:51.113 回答
1

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

您还需要注意,Vows 在获得任何返回值时结束测试(除了undefined,这相当于不返回任何内容)。由于 CoffeeScript 的隐式返回,这意味着您必须非常小心。(我记录在案,支持-/>没有返回值的函数的替代语法;请参阅问题 899。

于 2011-08-31T19:46:10.883 回答