gpt4 book ai didi

debugging - 为什么在使用 dart :io? 进行单元测试期间进程没有退出

转载 作者:行者123 更新时间:2023-12-02 18:05:18 24 4
gpt4 key购买 nike

以下代码测试服务器上接收到的客户端发送的数据。

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:unittest/unittest.dart';

main() {
ServerSocket ss;

setUp(() => ServerSocket.bind('localhost', 9876).then((e) => ss = e));

tearDown(() => ss.close());

test('test 1', () {
final line = new Completer<String>();
ss.listen((s) => s.map(UTF8.decode).listen((s) => line.complete(s)));
Socket.connect(ss.address, ss.port)
.then((s) {
s.write('test');
return s.close();
})
.then((_) => line.future)
.then(expectAsync((s) => expect(s, equals('test'))));
});
}

此测试显示:

unittest-suite-wait-for-done
PASS: test 1

All 1 tests passed.
unittest-suite-success

但是,该过程不会停止。

  1. 为什么即使使用 ss.close()s.close(),进程仍在运行?
  2. 如何找到使进程保持活力的因素?是Observatory提供一些东西来调试?

最佳答案

编辑:请参阅下面亚历克斯的回答。 Socket.drain() FTW!

根据observatory io page时,服务器创建的套接字仍处于打开状态以进行写入。我已更新以下代码以调用 destroy()在服务器和客户端套接字上。 destroy()关闭 Socket双向。

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:unittest/unittest.dart';

main() {
ServerSocket ss;

setUp(() => ServerSocket.bind('localhost', 9876).then((e) => ss = e));

tearDown(() => ss.close());

test('test 1', () {
final line = new Completer<String>();
ss.listen((s) {
s.map(UTF8.decode).listen((t) {
line.complete(t);
s.destroy();
});
});
Socket.connect(ss.address, ss.port)
.then((s) {
s.write('test');
return s.flush().then((_) {
s.destroy();
return line.future;
});
})
.then(expectAsync((s) => expect(s, equals('test'))));
});
}

关于debugging - 为什么在使用 dart :io? 进行单元测试期间进程没有退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28159029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com