Что не так с моим использованием подтем vows.js?

По некоторым причинам я не могу заставить работать подтемы vows.js в моем реальном наборе тестов, но они прекрасно работают в файле примера... Можете ли вы определить мою проблему?

Это работает:

vows.describe('An Education in Vows').addBatch({
    'when I write an asynchronous topic': {
        topic: function() {
            var that = this;
            setTimeout(function() {
                that.callback(true);
            }, 100);
        },
        'it passes': function (topic) {
            assert.equal(topic, true);
        },
        'and it has an asynchronous sub-topic': {
            topic: function() {
                var that = this;
                setTimeout(function() {
                    that.callback(true);
                }, 100);
            },
            'it also passes': function (topic) {
                assert.equal(topic, true);
            }
        }
    }
}).run();

Когда я запускаю это через:

node tests/learning-vows.js

Я получил:

·
·
✓ OK » 2 honored (0.207s)

Это не работает:

У меня есть файл./tests/smoke.js

vows.describe('Registration & Authentication').addBatch({
    'when a user registers with a valid username and password': {
        topic: function () {
            client.register({
                username: validusername,
                password: validpassword
            }, this.callback);
        },
        'we return status 200 OK': function (data, response) {
            assert.equal(200, response.statusCode);
        },
        'simple sub-topic': {
            topic: true,
            'should work': function(topic) {
                assert.equal(true, topic);
            }
        },
    }
}).run()

Когда я выполню это через:

node tests/smoke.js

Я получил:

·
✗ Errored » 1 honored ∙ 1 errored

Обратите внимание, что во втором примере без подтемы я получаю:

·
✓ OK » 1 honored (0.100s)

1 ответ

Vows использует соглашение об узлах для обратных вызовов (см.: http://nodemanual.org/latest/nodejs_dev_guide/working_with_callbacks.html) и предполагает, что первый параметр обратного вызова является объектом ошибки.

Поэтому, когда вы отправляете data в качестве первого параметра ваши клятвы, что ошибка произошла в client.register, Это предотвращает обеты от оценки подтемы. Подтема помечена с ошибкой, но утверждение выполнено успешно, а текущая тема помечена как выполненная.

Это действительно не тривиально, чтобы догадаться, что из вывода. Кроме того, поведение обетов не соответствует, попробуйте заменить true в 0 а потом '0' в качестве параметра обратного вызова в вашем первом тесте, и вы увидите два других результата.

Вот рабочий пример:

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

var client = {
  register: function(obj,callback){
    callback(null, obj, {statusCode:200});
  }
};
vows.describe('Registration & Authentication').addBatch({
    'when a user registers with a valid username and password': {
        topic: function () {
            client.register({
                username: 'validusername',
                password: 'validpassword'
            }, this.callback);
        },
        'we return status 200 OK': function (err, data, response) {
            assert.equal(response.statusCode, 200);
        },
        'simple sub-topic': {
            topic: true,
            'should work': function(topic) {
                assert.equal(true, topic);
            }
        }
    }
}).export(module)
Другие вопросы по тегам