# Eine Flow-Komponente allein mit Flow.test() testen

> Lade eine Komponente in einen eigenen Fluss, sende ihr aus dem Code eine Nachricht und lies, was sie an ihre Ausgänge sendet, ohne den ganzen Fluss zu bauen.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: de
Content-SHA256: fea4189f9ac87c8e4d3ccf3541354830364430409dc97970846b09adf5f541ec
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`Flow.test(name, source, [config], [init])` baut einen Fluss mit **einer** Komponente (der `source` ist ihr Code, wie im Rezept zu FlowStream, und `config` ersetzt ihre Konfiguration) und einer Dummy-Komponente, die ihre Ausgaben sammelt. `init(test)` wird aufgerufen, wenn der Fluss bereit ist, mit dem Objekt `test`:

- `test.send(inputid, data)` (auch `test.input`) sendet eine Nachricht an einen Eingang der Komponente und gibt sie zurück.
- `test.message = function($, data)`: wird mit jeder Nachricht aufgerufen, die die Komponente an **einen beliebigen ihrer Ausgänge** sendet; `$` ist die Nachricht und `data` ihre Daten.
- `test.reconfigure(config)` ändert die Konfiguration; `test.configure = function(config)` wird danach aufgerufen. `test.variables(object)` setzt die Variablen des Flusses.
- `test.assert(ok, message)`, `test.ok(message)` und `test.fail(message)` geben `[OK]` oder `[NO]` mit dem Datum aus, und ein Fehlschlag wirft eine Ausnahme. Die Funktionen sind einfache Eigenschaften: Ersetze `test.ok` und `test.fail`, um das Ergebnis woandershin zu senden, wie es das Beispiel tut.
- Der Testfluss hat immer die ID `test`: nur ein `Flow.test()` gleichzeitig.

Es ist für die Tests einer Komponente gedacht, die für einen Flow geschrieben wurde, ausgeführt mit `node index.js` in einer kleinen eigenen Anwendung.

```js definitions/component-test.js
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);
	});
});
```

```js controllers/results.js
exports.install = function() {
	ROUTE('GET /results/', results);
};

function results($) {
	$.json(MAIN.results);
}
```
