Проблемы с созданием юнит-теста для http.post - PullRequest
0 голосов
/ 03 октября 2019

Я создал этот класс для использования http.post в dart:

class SigninDataSource {
  final http.Client client;

  SigninDataSource(this.client);

  Future<SignIn> signIn ({
    String email = 'test@hotmail.com',
    String password = 'test',
  }) async {
    var url = "https://test/test/signin";
    var body = json.decode('{"email": "$email", "password": "$password"}');

    final result = await client.post(url, body: json.encode(body), headers: {"content-type": "application/json",});
    print("Result");
    print(result);

    if(result.statusCode == 200) {
      SignIn.fromJson((result.body));
      return SignIn.fromJson(result.body);
    } else {
      throw SignInError(json.decode(result.body)['message']);
    }
  }
}

Я пытался создать для него модульный тест.

class MockClient extends Mock implements http.Client {}

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

  MockClient mockClient;
  SigninDataSource dataResource;

  setUp((){
    mockClient = MockClient();
    dataResource = SigninDataSource(mockClient);
  });

  group('signin', () {
    test(
      'return SignIn whrn the service call complete succesfully',
        () async {
          when(
            mockClient.post(
              "https://test/test/signin",
              body: '{"email": "test@test.com", "password": "Test@123"}',
              headers: {"content-type": "application/json"}
            )).thenAnswer(
              (_) async => http.Response('{"status": 200}', 200));
          expect(await dataResource.signIn(email: 'test@test.com', password:'Test@123'),TypeMatcher<SignIn>());
        }
    );
  });
}

но я получаю эту ошибку:

Result
null

NoSuchMethodError: The getter 'statusCode' was called on null.
Receiver: null
Tried calling: statusCode

Я думаю, что мой фиктивный метод не работает, но я не могу понять, в чем проблема. Я проверял эту документацию https://flutter.dev/docs/cookbook/testing/unit/mocking Я пытался скопировать ее для http.post. Пожалуйста, кто-нибудь с большим опытом может помочь мне найти проблему?

1 Ответ

1 голос
/ 04 октября 2019

Параметр body {"email": "test@test.com", "password": "Test@123"} в mockClient.post() во время создания заглушки не совпадает с параметром, передаваемым в client.post() в SigninDataSource.

Если вы проверяете строку, переданную в client.post()

От

final result = await client.post(url, body: json.encode(body), headers: {
  "content-type": "application/json",
});

до

var encodedBody = json.encode(body);

final result = await client.post(url, body: encodedBody, headers: {
    "content-type": "application/json",
});

Значение encodedBody равно {"email":"test@test.com","password":"Test@123"}. Обратите внимание, что пробелов нет.

Вы также можете изменить эту заглушку, если хотите игнорировать значение передаваемых параметров, поскольку вам нужен только ответ об успешном завершении. Вы будете использовать anyNamed('paramName').

when(mockClient.post("https://test/test/signin",
        body: anyNamed('body'),
        headers: anyNamed('headers')))
    .thenAnswer((_) async => http.Response('{"status": 200}', 200));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...