颤振/的Mockito。使用mockito测试API提供程序,api标题的问题

问题描述 投票:0回答:1

我想用mockito插件测试我的提供程序但是有一个问题,正如我对标题的理解。

我打印时显示null(响应)

如果我从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);

      },
    );
  });


}

dart flutter mockito
1个回答
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')将匹配任何标题。

© www.soinside.com 2019 - 2024. All rights reserved.