2

我正在尝试结合此处的示例,在这里为我的 node.js / express 应用程序编写一个誓言测试:

  1. 创建一个新的用户对象
  2. 检查响应是否正常
  3. 使用返回的 _id 来测试查找新创建的用户
  4. 再次使用 _id 来测试更新用户

第 1 项和第 2 项工作正常,但我的子上下文 'GET /users/:id' 有问题。它出错了,我不知道为什么。尝试谷歌搜索并使用调试器,但我仍然看不到它是什么,我可能只是忽略了一些明显的东西。

···✗ Errored » 3 honored ∙ 1 errored

谁能告诉我为什么第四个誓言错误?

这是我的誓言代码:

var vows = require('vows')
  , assert = require('assert')
  , tobi = require('tobi')

var suite = vows.describe('Users API')
  , now = new Date().getTime()
  , newUser = { name: now + '_test_user', email: now + '@test.com' }
  , browser = tobi.createBrowser(3000, 'localhost')
  , defaultHeaders = { 'Content-Type': 'application/json' }

function assertStatus(code) {
  return function (res, $) {
    res.should.have.status(code)
  }
}

var client = {
  get: function(path) {
    return function() {
      browser.get(path, { headers: defaultHeaders }, this.callback)
    }
  },
  post: function(path, data) {
    return function() {
      browser.post(path, { body: JSON.stringify(data), headers: defaultHeaders }, this.callback)
    }
  }
}

suite.addBatch({
  'GET /users': {
    topic: client.get('/users'),
    'should respond with a 200 ok': assertStatus(200)
  },
  'POST /users': {
    topic: client.post('/users', newUser),
    'should respond with a 200 ok': assertStatus(200),
    'should return the new user': function(res, $){
      assert.isNotNull(res.body._id)
      assert.isNotNull(res.body.created_at)
      assert.isTrue(res.body._id.length > 0)
      assert.equal(newUser.name, res.body.name)
      assert.equal(newUser.email, res.body.email)
    },
    'GET /users/:id': {  // Sub-context of POST /users
      topic: function(res) { return client.get('/users/' + res.body._id) },
      'should respond with a 200 ok': assertStatus(200)
    }
  }
})

suite.export(module)

编辑

我尝试将代码简化如下,以帮助查看 this.callback 是否是问题所在,但错误仍然存​​在:

'GET /users/:id': {  // Sub-context of POST /users
  topic: function(res) {
    console.log('About to request /users/' + res.body._id)
    browser.get('/users/' + res.body._id, { headers: defaultHeaders }, this.callback)
  },
  'should respond with a 200 ok': assertStatus(200)
}
4

1 回答 1

1

您如何为第四次测试填充 res ?它不会在线外可见

'should return the new user'

尝试在 addBatch 调用之外创建 id 变量,并在第三次测试中设置它。然后打电话

client.get('/users/' + id)

编辑

更好的是,在第三个测试中将其放回 newUser 中:

'should return the new user': function(res, $){
  newUser.id = res.body._id
....

然后做:

client.get('/users/' + newUser.id)
于 2011-08-02T21:32:34.460 回答