Как смоделировать методы отправки в ReduxAction из трепетного пакета `async_redux` - PullRequest
0 голосов
/ 11 февраля 2020

Я разрабатываю приложение android / ios во флаттере, и я решил использовать избыточность для управления своим состоянием.

Я пишу модульные тесты для моих действий избыточности, которые были реализованы используя пакет async_redux .

Я следую отличным рекомендациям, изложенным для тестирования автором пакета, но я не уверен, как высмеивать отправку дальнейших действий из моего действия проверяется.

Например, ниже LogoutAction отправляет DeleteDatabaseAction и ожидает его завершения:

class LogoutAction extends ReduxAction<AppState> {
  @override
  Future<AppState> reduce() async {
    await dispatchFuture(DeleteDatabaseAction());
    return AppState.initialState();
  }
}

class DeleteDatabaseAction extends ReduxAction<AppState> {
  @override
  FutureOr<AppState> reduce() {
    throw StateError(
      'Unwanted call to runtime implementation of DeleteDatabaseAction',
    );
  }
}
void main() {
  final store = Store<AppState>(initialState: AppState(loggedIn: true));
  final storeTester = StoreTester.from(store);

  test('Logout action should return correct state and not throw StateError', () async {
    storeTester.dispatch(LogoutAction());

    TestInfo<AppState> info = await storeTester.wait(LogoutAction);

    expect(info.state.loggedIn, false);
  });
}

Я хочу проверить только проверяемое действие и отложите все дальнейшие вызовы действий.

т.е. Как я могу смоделировать / заглушить методы dispatch и dispatchFuture на ReduxAction, чтобы реализация DeleteDatabaseAction времени выполнения не запускалась?

До сих пор я пытался:

  • Внедрить DeleteDatabaseAction, используя get_it и ввести макет во время теста

    • У меня есть более 100 действий, которые будут теперь нужно добавить в мой контекст
    • Некоторые действия имеют параметры, которые меняются в зависимости от того, откуда они вызываются, поэтому их нельзя зарегистрировать при запуске приложения
  • подкласс Store, переопределить вышеуказанные методы и использовать подкласс в моем тесте здесь final store = Store<AppState>(initialState: AppState(loggedIn: true))

    • Я не смогу отправить тестируемое действие, так как оно использует то же хранилище в реализации теста async_redux
    • Здесь: storeTester.dispatch(LogoutAction());
  • Создайте отдельную реализацию Dispatcher, внедрите это и переопределите с помощью макета во время тестов
    • Это будет работать, но это новый фреймворк, я могу go этот маршрут, но теперь я отклоняюсь от хорошо документированной среды, предоставленной asyn_redux
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...