Tester un composant Flow seul avec Flow.test()
Flow.test(name, source, [config], [init]) construit un flux avec un composant (le source est son code, comme dans la recette de FlowStream, et config remplace sa configuration) et un composant factice qui recueille ses sorties. init(test) est appelé quand le flux est prêt, avec l'objet test :
test.send(inputid, data)(aussitest.input) envoie un message à une entrée du composant et le renvoie.test.message = function($, data): appelé avec chaque message que le composant envoie à n'importe laquelle de ses sorties ;$est le message etdatases données.test.reconfigure(config)change la configuration ;test.configure = function(config)est appelé après.test.variables(object)définit les variables du flux.test.assert(ok, message),test.ok(message)ettest.fail(message)impriment[OK]ou[NO]avec la date, et un échec lève une exception. Les fonctions sont de simples propriétés : remplaceztest.okettest.failpour envoyer le résultat ailleurs, comme le fait l'exemple.- Le flux de test a toujours l'id
test: un seulFlow.test()à la fois.
Il est conçu pour les tests d'un composant écrit pour un Flow, exécutés avec node index.js dans une petite application à part.
MAIN.results = [];
const source = `<script total>
exports.id = 'tax';
exports.name = 'Tax';
exports.inputs = [{ id: 'input', name: 'Input' }];
exports.outputs = [{ id: 'output', name: 'Output' }];
exports.config = { rate: 21 };
exports.make = function(instance, config) {
instance.message = function($) {
$.send('output', { net: $.data, total: Math.round($.data * (100 + config.rate)) / 100 });
};
};
</script>`;
ON('ready', function() {
Flow.test('tax', source, { rate: 10 }, function(test) {
test.ok = message => MAIN.results.push('ok: ' + message);
test.fail = message => MAIN.results.push('no: ' + message);
test.message = function($, data) {
test.assert(data.net === 100, 'the net amount comes back');
test.assert(data.total === 110, 'the configuration of the test (10 %) is used, got ' + data.total);
MAIN.results.push('message: ' + JSON.stringify(data));
};
test.send('input', 100);
});
});exports.install = function() {
ROUTE('GET /results/', results);
};
function results($) {
$.json(MAIN.results);
}