Como escrever testes de votos nodejs com tópico assíncrono

Um teste de votos simples se parece com isto (dos documentos de votos):

vows.describe('Division by Zero').addBatch({
'when dividing a number by zero': {
topic
: function () { return 42 / 0 },

'we get Infinity': function (topic) {
assert
.equal (topic, Infinity);
}
}
}).export(module);

A topicé a função que é chamada para “retornar” o resultado a ser testado. Mas e se o resultado for calculado por uma chamada assíncrona como essa?

account.find(id).balance(function(balance) {
// Now I have the 'balance', but what to do with this?
});

Bem, o segredo aqui é que a topicfunção pode usar um atributo de objeto oculto chamado this.callback. Este método recebe dois parâmetros: o primeiro é um erro (pode ser nulo em caso de sucesso) e o segundo é o valor a ser testado. Exemplo:

vows.describe('Reading account balance').addBatch({
'when consulting balance of account 1': {
topic
: function () {
var c = this.callback;
account
.find(1).balance(function(balance) {
c
(null, balance);
});
},

// Assuming the balance for account 1 is 100.
'then balance equal 100': function (topic) {
assert
.equal (topic, 100);
}
}
}).export(module);