Flutter / Mockito。使用Mockito测试API提供程序,API头出现问题

时间:2019-04-24 09:19:14

标签: dart flutter mockito

我想用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 :(得分:0)

仅当when的所有参数与您指定的参数匹配时,Mockito才会响应您的mockClient.get()句子。

在这种情况下,您仅指定了URL,仅此而已。由于您的代码使用的是URL,因此标头Mockito将不匹配,也不会执行您的thenAnswer

when句子中,您必须指定headers参数以匹配您测试的代码

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

在这里,anyNamed('headers')将匹配任何标题。