# Die Anwendung mit dem eingebauten Test-Runner testen

> Schreibe eine test.js, die die App startet, Tests mit Test.push() registriert, Ergebnisse mit Test.print() prüft und mit einem Code ungleich null endet, wenn einer fehlschlägt.

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

Total.js hat einen kleinen Test-Runner, `total5/test`. Eine Testdatei ist ein normales Total.js-Skript: Sie lädt das Framework und den Runner, startet die Anwendung und registriert ihre Tests, sobald sie `ready` ist. `Test.push(name, fn)` fügt einen Test hinzu; `fn(next)` erledigt seine Arbeit und ruft `next()` auf, um mit dem folgenden fortzufahren. `Test.print(message, error)` meldet eine Prüfung: Übergib `null` als `error` für Erfolg (`[OK]` wird ausgegeben) oder eine Meldung für einen Fehlschlag (`[FAIL]` wird ausgegeben und der Prozess endet mit Code 1). `Test.run()` führt die registrierten Tests der Reihe nach aus und endet am Schluss mit Code 0.

Weil ein Fehlschlag den Prozess mit einem Code ungleich null beendet, kann die Datei von `npm test` und von jedem CI-Dienst aufgerufen werden. Warte nach `ready` einen Moment (etwa 500 ms) vor der ersten Anfrage: Eine sofort gesendete Anfrage kann noch ein 404 erhalten. Verwende `RESTBuilder` (oder `REQUEST`) gegen den lokalen Server, um Routen zu testen, und rufe Actions direkt mit `ACTION()` auf.

```js controllers/sum.js
exports.install = function() {
	ROUTE('GET /sum/{a}/{b}/', sum);
	ROUTE('GET /dir/', dir);
};

function sum($) {
	$.json({ total: +$.params.a + +$.params.b });
}

function dir($) {
	$.json({ dir: PATH.root() });
}
```

```js test.js
require('total5');
require('total5/test');

// Another port than the application uses, so both can run
Total.run({ port: 8765, release: false, watcher: false });

ON('ready', function() {

	// A request sent in the same tick as "ready" can still get a 404, so give the routes a moment
	setTimeout(runtests, 500);
});

function runtests() {

	Test.push('The sum route', function(next) {
		RESTBuilder.GET('http://127.0.0.1:8765/sum/2/3/').exec(function(err, response) {
			Test.print('2 + 3 = 5', response && response.total === 5 ? null : 'Expected 5, got ' + JSON.stringify(response));
			next();
		});
	});

	Test.push('Unknown route', function(next) {
		RESTBuilder.GET('http://127.0.0.1:8765/missing/').exec(function(err, response, output) {
			Test.print('/missing/ answers 404', output.status === 404 ? null : 'Expected 404, got ' + output.status);
			next();
		});
	});

	Test.run();
}
```
