Dart — Как написать тест для функции, которая вызывает exit()?

Я хочу протестировать функцию, которая вызывает выход.

По сути, у меня есть консольное приложение, которое спрашивает пользователя, уверен ли он, что хочет перезаписать каталог. Когда пользователи ответят «Нет», каталог не будет перезаписан, и программа должна выйти.

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

Итак, я хочу проверить, что если пользователь ответит «Нет», программа действительно закроется. Но если я проверю это, мой тестовый бегун выйдет.

В python я, кажется, могу сделать что-то вроде:

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

Есть ли что-то подобное в Дарте?


person Kasper    schedule 07.10.2015    source источник


Ответы (2)


Вы можете внедрить пользовательскую функцию 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();

Лучшим решением было бы использовать зоны, но, похоже, невозможно обработать exit . Возможно, стоит отправить сообщение о проблеме.

person Alexandre Ardhuin    schedule 07.10.2015

Один из вариантов, который приходит мне на ум, — запустить код, который вы хотите протестировать, в новом процессе Process.run() или Process.start() и проверить код выхода в конце. Вы можете использовать stdin/stdout для связи с процессом (отправка ввода с клавиатуры, чтение вывода)

person Günter Zöchbauer    schedule 07.10.2015
comment
Только что увидел, что Jerweb предложил то же самое в Slack :) - person Günter Zöchbauer; 07.10.2015