# Egy Flow-komponens önálló tesztelése a Flow.test()-tel

> Töltsön be egy komponenst egy saját folyamatba, küldjön neki üzenetet a kódból, és olvassa, mit küld a kimeneteire, a teljes folyamat felépítése nélkül.

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

A `Flow.test(name, source, [config], [init])` egy **egyetlen** komponenst tartalmazó folyamatot épít (a `source` a komponens kódja, mint a FlowStream receptjében, a `config` pedig lecseréli a konfigurációját), valamint egy próbakomponenst, amely összegyűjti a kimeneteit. Az `init(test)` akkor hívódik meg, amikor a folyamat kész, a `test` objektummal:

- A `test.send(inputid, data)` (és a `test.input`) üzenetet küld a komponens egy bemenetére, és visszaadja azt.
- `test.message = function($, data)`: minden olyan üzenettel meghívódik, amelyet a komponens **bármelyik kimenetére** küld; a `$` az üzenet, a `data` pedig az adata.
- A `test.reconfigure(config)` megváltoztatja a konfigurációt; a `test.configure = function(config)` ezután hívódik meg. A `test.variables(object)` beállítja a folyamat változóit.
- A `test.assert(ok, message)`, a `test.ok(message)` és a `test.fail(message)` `[OK]` vagy `[NO]` jelzést ír ki dátummal, a hiba pedig kivételt dob. A függvények egyszerű tulajdonságok: cserélje le a `test.ok` és a `test.fail` értékét, hogy az eredményt máshová küldje, ahogy a példa is teszi.
- A tesztfolyamat azonosítója mindig `test`: egyszerre csak egy `Flow.test()`.

Egy Flow-hoz írt komponens tesztjeire szolgál, a `node index.js` paranccsal futtatva egy kis saját alkalmazásban.

```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);
}
```
