新的Dart,单元测试和异步编程在一般情况下。还有StackOverflow,在这方面。试图围绕RESTful构建shelf_route服务器,并使用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));
}));
});
});
}发布于 2014-06-06 04:08:39
看起来这并不是引发问题的原因,但是如果您在setUp中启动异步操作,您应该返回未来。
return io.serve(handler, HOST, PORT).then((s) {
server = s;单元测试框架在开始运行测试之前等待未来返回。
我认为测试也应该这样做。据我所知,有一个开放的错误,对于测试本身来说,在异步操作启动时返回未来就足够了,但是它在这里不像在setUp中那样工作。这是很久以前的事了,所以我想这是固定的。
test('Invalid URL returns 404', () {
return new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT'))
.then((HttpClientRequest request) => request.close())
.then(expectAsync((HttpClientResponse response) {
expect(response.statusCode, equals(404));
}));
});如果这不起作用
test('POST / ...
test('Invalid URL returns 404', () {
var cb = new expectAsync((){});
new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT'))
.then((HttpClientRequest request) => request.close())
.then(expectAsync((HttpClientResponse response) {
expect(response.statusCode, equals(404));
cb(); // <== to notify the unit test framework that the async operation is finished
}));
});发布于 2014-11-14 07:21:02
在主函数的开头添加以下内容: useGoogle3VMConfiguration();
https://stackoverflow.com/questions/24073187
复制相似问题