Тестирование API REST с использованием vows, tobi и node.js - PullRequest
2 голосов
/ 03 августа 2011

Я пытаюсь объединить примеры здесь , здесь , чтобы написать тест обетов для моего приложения node.js / express, которое:

  1. Создает новый пользовательский объект
  2. Проверяет, был ли ответ вменяемым
  3. Использует возвращенный _id для проверки поиска вновь созданного пользователя
  4. Снова использует _id для проверки обновления пользователя

Пункты 1 и 2 работают нормально, но что-то не так с моим под-контекстом 'GET / users /: id'. Это ошибки, и я не могу понять, почему. Пробовал гуглить и использовать отладчик, но я до сих пор не вижу, что это такое, наверное, я просто пропускаю что-то очевидное.

···✗ Errored » 3 honored ∙ 1 errored

Может кто-нибудь сказать мне, почему ошибки 4-го обета?

Вот мой код обетов:

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)

EDIT

Я попытался упростить код следующим образом, чтобы понять, была ли проблема в 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)
}

1 Ответ

1 голос
/ 03 августа 2011

Как вы заполняете Res для четвертого теста ??Он не будет виден вне строки

'should return the new user'

Попробуйте создать переменную id вне вызова addBatch и установить ее в третьем тесте.затем вызовите

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

РЕДАКТИРОВАТЬ :

Еще лучше, верните его в newUser в третьем тесте:

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

и затем:

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