Как написать тест для построения класса с помощью Dio? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть класс, который будет извлекать imgUrl при первом создании в конструкторе. И мне нужно написать тест, чтобы убедиться, что вызывается метод get экземпляра Dio. Однако у меня проблема с тем, что результат выборки возвращает null вместо Future, поэтому я не могу вызвать then.


Класс:

@JsonSerializable()
class DogBreed with ChangeNotifier {
  @JsonKey(ignore: true)
  final Dio dio;

  final String id;
  final String bred_for;
  final String breed_group;
  final String life_span;
  final String name;
  final String origin;
  final String temperament;
  final String description;
  final Measurement height;
  final Measurement weight;

  var imgUrl = '';

  DogBreed({
    this.dio,
    this.id,
    this.bred_for,
    this.breed_group,
    this.life_span,
    this.name,
    this.origin,
    this.temperament,
    this.description,
    this.height,
    this.weight,
  }) {
    dio.get(
      'xxxxx,
      queryParameters: {
        'breed_id': id,
        'limit': 1,
      },
    ).then((result) {
      final List data = result.data;

      if (result.statusCode == 200) {
        if (data.isNotEmpty) {
          imgUrl = result.data[0]['url'];
        } else {
          imgUrl = NO_IMAGE_AVAILABLE_URL;
        }
        notifyListeners();
      }
    });
  }

  factory DogBreed.fromJson(Map<String, dynamic> json) =>
      _$DogBreedFromJson(json);
}

Мой тест :

class MockDio extends Mock implements Dio {}

void main() {
  MockDio mockDio;

  setUp(() {
    mockDio = MockDio();
  });

  test(
    "fetch the imageUrl on constructor",
    () async {
      when(mockDio.get(any))
          .thenAnswer((_) async => Response(data: 'url', statusCode: 200));

      final newBreedProvider = DogBreed(
        dio: mockDio,
        id: '12',
      );

      verify(mockDio.get(
        'xxxx',
        queryParameters: {
          'breed_id': 12,
          'limit': 1,
        },
      ));
    },
  );
}

Результат при запуске теста:

dart:core                                                           Object.noSuchMethod
package:practises/projects/dog_facts/providers/dog_breed.dart 46:7  new DogBreed
test/projects/dog_facts/providers/dog_breed_test.dart 24:32         main.<fn>

NoSuchMethodError: The method 'then' was called on null.
Receiver: null
Tried calling: then<Null>(Closure: (Response<dynamic>) => Null)

Может ли кто-нибудь помочь мне разобраться, как написать этот тест, или предложить мне новый способ реализации, чтобы я мог написать тест на это?

1 Ответ

1 голос
/ 04 февраля 2020

Я понял, почему, это моя ошибка, что мне нужно предоставить queryParameters для get метода в тесте. Должно быть:

      when(
        mockPdio.get(
          any,
          queryParameters: anyNamed('queryParameters'),
        ),
      ).thenAnswer((_) async => Response(data: 'url', statusCode: 200));

Ура.

...