3

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

ここで私が間違っていることについてのアイデアはありますか?

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

私が見た問題の 1 つは、それtopic.saveがノーオペレーションであることtopic.save()です。this.callbackもう 1 つのより深刻な問題は、非同期テストにVows を使用する必要があることです。Raynosの回答を参照してください。

また、Vows が戻り値を取得したときにテストを終了することにも注意する必要があります (何もundefined返さないことと同等の 以外)。CoffeeScript の暗黙の戻り値のため、これは非常に注意する必要があることを意味します。-/>(戻り値のない関数の代替構文をサポートしていると記録に残っています。issue 899を参照してください。)

于 2011-08-31T19:46:10.883 に答える