Получить 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
});

0 ответов

Другие вопросы по тегам