Что не так с моим использованием подтем 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)