我对Dart、单元测试和异步编程都很陌生,StackOverflow也一样。我试图使用shelf_route构建一个RESTful服务器,并使用HttpClient进行测试。
我的测试可以运行,但无法自动终止进程。我尝试过网上找到的几种方法,但没有成功。有人能帮帮我吗?以下是我的代码:
import 'dart:io';
import 'package:unittest/unittest.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'package:toner_track/handlers.dart';
import 'package:toner_track/config.dart';
void main() {
var server;
group('Server tests', () {
var server;
setUp(() {
var handler = const shelf.Pipeline().addHandler(router);
io.serve(handler, HOST, PORT).then((s) {
server = s;
});
});
tearDown(() {
server.close();
});
test('Invalid URL returns 404', () {
new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT'))
.then((HttpClientRequest request) => request.close())
.then(expectAsync((HttpClientResponse response) {
expect(response.statusCode, equals(404));
}));
});
test('GET /printers returns 200', () {
new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT$rootPrintersPath'))
.then((HttpClientRequest request) => request.close())
.then(expectAsync((HttpClientResponse response) {
expect(response.statusCode, equals(200));
}));
});
test('POST /printers returns 201', () {
new HttpClient().postUrl(Uri.parse('http://$HOST:$PORT$rootPrintersPath'))
.then((HttpClientRequest request) {
request.write('{"foo": 42}');
return request.close();
})
.then(expectAsync((HttpClientResponse response) {
expect(response.statusCode, equals(201));
}));
});
});
}
更新:决定放弃HttpClient,转而使用http
包。更容易处理,我的测试现在能够自动终止。显然,在第一次尝试中我没有正确处理某些东西。以下是现在代码的样子:
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:unittest/unittest.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'package:toner_track/handlers.dart';
import 'package:toner_track/config.dart';
void main() {
group('Server tests', () {
var server;
setUp(() {
var handler = const shelf.Pipeline().addHandler(router);
return io.serve(handler, HOST, PORT).then((s) {
server = s;
});
});
tearDown(() {
server.close();
});
test('Invalid URL returns 404', () {
http.get('http://$HOST:$PORT').then(expectAsync((response) {
expect(response.statusCode, equals(404));
}));
});
test('GET /printers returns 200', () {
http.get('http://$HOST:$PORT$rootPrintersPath').then(expectAsync((response) {
expect(response.statusCode, equals(200));
}));
});
test('POST /printers returns 201', () {
http.post('http://$HOST:$PORT$rootPrintersPath', body: {"foo": "42"}).then(expectAsync((response) {
expect(response.statusCode, equals(201));
}));
});
});
}
expect
行?你有收到任何输出吗? - Günter Zöchbauerexpect
语句会被评估,这是重要的。但是即使所有测试运行(并通过),程序仍将继续运行。我必须手动终止进程。 - mgoodness