Детонация / Mockito. Тестирование провайдера API с mockito, проблема с заголовками API - PullRequest
0 голосов
/ 24 апреля 2019

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

показывает ноль когда я делаю печать (ответ)

если я удалю заголовки из API

headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Authorization': 'Bearer $token',
      },

тест работает нормально, но с заголовками:

NoSuchMethodError: The getter 'statusCode' was called on null.
Receiver: null
Tried calling: statusCode
dart:core                                                   Object.noSuchMethod
package:mba/resources/providers/post_provider.dart 38:20  PostProvider.fetchPosts
===== asynchronous gap ===========================
dart:async                                                  _AsyncAwaitCompleter.completeError
package:mba/resources/providers/post_provider.dart        PostProvider.fetchPosts
===== asynchronous gap ===========================
dart:async                                                  _asyncThenWrapperHelper
package:mba/resources/providers/post_provider.dart        PostProvider.fetchPosts
test/resources/providers/post_provider_test.dart 46:39    main.<fn>.<fn>

Поставщик:

import 'package:http/http.dart' as http;

import 'package:mba/env.dart';
import 'package:mba/core/models/post_model.dart';


class PostProvider {
  final http.Client client;

  final String _api = API;
  // Map<String, List<Post>> _postsList = Map();

  PostProvider(this.client);

  Future<Map<String, List<Post>>> fetchPosts(String token) async {
    final response = await client.get(
      '${_api}posts',
      headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Authorization': 'Bearer $token',
      },
    );

    print('-------------');
    print(response);
    print(response.statusCode);
    print(response.body);

    //todo: decode and mapping
    if (response.statusCode == 200) {
      return Map();
    } else {
      throw 'xxxx';
    }
  }

тестовый файл:

import 'dart:io';
import 'package:mba/resources/providers/post_provider.dart';
import 'package:mockito/mockito.dart';
import 'package:http/http.dart' as http;

import 'package:flutter_test/flutter_test.dart';
import 'package:matcher/matcher.dart';


class MockClient extends Mock implements http.Client {}

void main() {
  String fixture(String name) =>
      File('test/fixtures/posts/$name.json').readAsStringSync();

  MockClient mockClient;
  PostProvider dataSource;

  setUp(() {
    mockClient = MockClient();
    dataSource = PostProvider(mockClient);
  });

  group('searchVideos', () {
    test(
      'returns YoutubeSearchResult when the call completes successfully',
      () async {
        when(
          mockClient.get(
            argThat(
              startsWith('http://localhost:55005/api'),
            ),
          ),
        ).thenAnswer(
          (_) async => http.Response(
                fixture('posts'),
                200,
                headers: {'content-type': 'application/json; charset=utf-8'},
              ),
        );

        var result = await dataSource.fetchPosts('resocoder');
        print(result);

      },
    );
  });


}

1 Ответ

0 голосов
/ 24 апреля 2019

Mockito ответит на ваше предложение when тогда и только тогда, когда все аргументы mockClient.get() соответствуют указанному вами.

В вашем случае вы указали URL-адрес и ничего более.Поскольку в вашем коде используется URL-адрес, а mockito не будет совпадать и не будет выполнять thenAnswer.

. В предложении when необходимо указать аргумент headers, соответствующий проверенному коду * 1009.*

        when(
          mockClient.get(
            argThat(
              startsWith('http://localhost:55005/api'),
            ),
            headers: anyNamed('headers'), // Add this line
          ),
        ).thenAnswer(...);

Здесь anyNamed('headers') будет соответствовать любому заголовку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...