Dart - 如何针对调用 exit() 的函数编写测试?

Dart - How do you write a test against a function that calls exit()?

我想测试一个调用 exit 的函数。

基本上,我有一个控制台应用程序,询问用户是否确定要覆盖目录。当用户回答"No",目录不会被覆盖,程序应该退出。

promptToDeleteRepo() {
  bool okToDelete = ...
  if(okToDelete) {
    deleteRepo();
  } else {
    exit(0);
  }
}

所以我想测试如果用户回答 "No",程序是否真的退出。但是如果我测试这个,我的测试运行器就会退出。

在 python 中,我似乎可以做类似的事情:

with pytest.raises(SystemExit):
    promptToDeleteRepo();

Dart 中有这样的东西吗?

我想到的一个选择是 运行 您要在新进程中测试的代码 Process.run()Process.start() 并检查最后的退出代码。您可以使用 stdin/stdout 与进程通信(发送键盘输入,读取输出)

您可以在测试期间注入自定义 exit 函数。

import 'dart:io' as io;

typedef ExitFn(int code);

ExitFn exit = io.exit;

promptToDeleteRepo() {
  bool okToDelete = ...
  if(okToDelete) {
    deleteRepo();
  } else {
    exit(0);
  }
}

在你的测试中:

int exitCodeUsed;
mylib.exit = (int code) {exitCodeUsed = code};
mylib.promptToDeleteRepo();

更好的解决方案必须使用 zones but there doesn't seem to be possible to handle exit. It could be worth to file an issue