Получить SendPort именованного ReceivePort без прямого доступа к ReceivePort для тестирования?
Я выполняю модульное тестирование и пытаюсь издеваться над классом, вызывающим функции C через ffi. Пара функций отвечает за запуск и остановку потока в C. Функция запуска передает nativePort в C для связи с потоком. Функция остановки сигнализирует потоку о завершении. Затем поток будет использовать дескриптор nativePort, чтобы сообщить слушателю, работающему в startFunction, о завершении.
DartFunc1() --ReceivePort.SendPort.nativePort--> нативная библиотека в C сохраняет дескриптор порта глобально и начинает обработку в потоке.DartFunc2() -> вызывает встроенную функцию C, которая использует глобальный дескриптор порта, чтобы сообщить об окончании обработки дротика.
В модульном тесте я пытаюсь имитировать это поведение, имитируя запуск и остановку вызова C. Однако я понятия не имею, как заставить дротик sendPort сообщить слушателю в другой функции, что мы закончили.
Я провожу буквально весь день в гугле в поисках похожих проблем (может быть, скрытых решений?), просматривая документацию mockito, flutter, пакета ffi.
Где-то я виделIsolateNameServer.lookupPortByName => SendPort?
и что я могу создать ReceivePort с аргументом имени (по крайней мере, для отладки), поэтому я так и сделал.
Код выглядит примерно так:
test("run", () {
when(() => clib.start).thenReturn((invocation) => (_) {});
when(() => clib.stop).thenReturn(() => () {
SendPort? port = IsolateNameServer.lookupPortByName("PortA");
port?.send(1);
});
expect(sut.isRunning, false); sut.start(); // will call clib.start internally
expect(sut.isRunning, true); sut.stop(); // will call clib.stop internally
expect(sut.isRunning, false); // <= this always fails
});