Использование Vows для тестирования моделей Mongoose - PullRequest
3 голосов
/ 31 августа 2011

Довольно новичок во всем сообществе 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

Есть идеи, что я здесь делаю не так?

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Это не так, как работает обет.обеты не могут быть асинхронными.Вы должны использовать подтемы для асинхронного тестирования

Псевдокод (я не могу написать 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 голос
/ 31 августа 2011

Одна проблема, которую я вижу, состоит в том, что topic.save не работает - вы, вероятно, имели в виду topic.save().Другая, более серьезная проблема заключается в том, что вам нужно использовать Vows this.callback для асинхронных тестов;см. ответ Рейноса.

Вам также нужно знать, что Vows завершает тест, когда получает любое возвращаемое значение (кроме undefined, что эквивалентно тому, что ничего не возвращается).Из-за неявных возвратов CoffeeScript это означает, что вы должны быть очень осторожными.(У меня есть сведения о том, что я поддерживаю альтернативный синтаксис -/> для функций без возвращаемого значения; см. выпуск 899 .)

...