Как написать модульный тест для эпического промежуточного программного обеспечения Flutter Redux? - PullRequest
0 голосов
/ 29 марта 2019

Я попытался написать модульный тест для промежуточного программного обеспечения Flutter Redux, содержащего запрос http. Но я не могу найти правильный способ сделать это.

Вот мой код промежуточного программного обеспечения:

List<Middleware<AppState>> appMiddleware([Dio dio]) {
  if (dio == null) {
    dio = Dio(options);
  }

  return [
    TypedMiddleware<AppState, FetchArticlesAction>(_fetchArticleList(dio)),
  ];
}

Middleware<AppState> _fetchArticleList(Dio dio) {
  return (Store<AppState> store, action, NextDispatcher next) async {
    next(action);

    try {
      final response = await dio.post(
        '/system/articles',
        data: {'page': 0, 'pagenum': 20},
      );

      if (response.data['Code'] == 0) {
        List<Article> articles = response.data['Data'].map<Article>((item) {
          return Article.fromJson(item);
        }).toList();
        store.dispatch(FetchArticlesSucceededAction(articles));
      } else {
        store.dispatch(FetchArticlesFailedAction(response.data['Msg']));
      }
    } catch (e) {
      store.dispatch(FetchArticlesFailedAction(e.toString()));
    }
  };
}

Вот мой тестовый код:

    test('should store articles into store when success', () async {
      final dio = DioMock();

      final store = Store<AppState>(
        appReducer,
        initialState: AppState(),
        middleware: appMiddleware(dio),
      );

      final Response response = Response(
        statusCode: 200,
        data: {
          "Code": 0,
          "Msg": "请求成功",
          "Data": [
            {
              "Id": 2,
              "CreatedAt": "1",
              "UpdatedAt": "1",
              "Title": "1",
              "Abstract": "1",
              "Cover": "1",
              "Content": "1"
            },
            {
              "Id": 1,
              "CreatedAt": "1",
              "UpdatedAt": "1",
              "Title": "1",
              "Abstract": "1",
              "Cover": "1",
              "Content": "1"
            }
          ]
        },
      );

      List<Article> articles = response.data['Data'].map<Article>((item) {
        return Article.fromJson(item);
      }).toList();

      when(dio.post('/system/articles', data: {'page': 0, 'pagenum': 20}))
          .thenAnswer((_) async => response);

      store.dispatch(FetchArticlesAction());

      expect(articlesSelector(store), articles);
    });

Я отладил тест, он закончится до обратного вызова промежуточного программного обеспечения. Есть ли способ исправить это, дождавшись завершения обратного вызова до ожидаемой функции? Или другой способ тестирования промежуточного программного обеспечения.

...