Зачем помечать модульный тест как асинхронный во Flutter

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

Просматривая документацию, я нашел этот фрагмент кода:

// Create a MockClient using the Mock class provided by the Mockito package.
// Create new instances of this class in each test.
class MockClient extends Mock implements http.Client {}

main() {
  group('fetchPost', () {
    test('returns a Post if the http call completes successfully', () async {
      final client = MockClient();

      // Use Mockito to return a successful response when it calls the
      // provided http.Client.
      when(client.get('https://jsonplaceholder.typicode.com/posts/1'))
          .thenAnswer((_) async => http.Response('{"title": "Test"}', 200));

      expect(await fetchPost(client), const TypeMatcher<Post>());
    });

    test('throws an exception if the http call completes with an error', () {
      final client = MockClient();

      // Use Mockito to return an unsuccessful response when it calls the
      // provided http.Client.
      when(client.get('https://jsonplaceholder.typicode.com/posts/1'))
          .thenAnswer((_) async => http.Response('Not Found', 404));

      expect(fetchPost(client), throwsException);
    });
  });
}

Если вы посмотрите внимательно, то заметите, что первый тест помечен как асинхронный, а второй — нет. Почему это? В чем разница между этими двумя тестами (кроме случаев), так что первый должен быть асинхронным?

Спасибо :)


person svarog    schedule 11.12.2019    source источник


Ответы (1)


Если вы хотите использовать await, вы должны пометить обратный вызов или функцию в целом как async.


В твоем случае:

expect(await fetchPost(client), const TypeMatcher<Post>());

await нужен, потому что важен результат выполнения функции. Они ожидают, что будет возвращен именно тип Post, следовательно, им нужен тип await.

В другом случае:

expect(fetchPost(client), throwsException);

Имеет значение только то, что выброшено исключение, но результат не имеет значения.

Когда помечать обратный вызов async при тестировании

Всякий раз, когда вам нужно await, вы помечаете свои обратные вызовы async. В общем, я бы посоветовал всегда ожидать функции в тестах, потому что в противном случае тесты будут выполняться параллельно, что может привести к нежелательному поведению.

person creativecreatorormaybenot    schedule 11.12.2019
comment
Спасибо большое, я сильно запутался. У меня есть еще один вопрос, пройдет ли первый тест, если мы опустим async/await, поскольку мы используем фиктивный объект? Спасибо еще раз :) - person svarog; 11.12.2019
comment
@hogar Я не знаю, как выглядит fetchPost, но если предположить, что он не возвращает тип FutureOr, нет -> Я только что просмотрел связанную статью, и тест не пройдет. Вы можете попробовать, если хотите. - person creativecreatorormaybenot; 11.12.2019