jeudi 28 février 2019

How can I mock an http error response in dart?

So I'm doing some unit tests for my http provider.

In one of my tests I want to verify that when I do a POST call and I get an error response with status 409 I do then a call to PATCH and everything works.

This is my code

  Future<IdentityResponse> _createUser(dynamic body) {
    return http
        .post(api, body: json.encode(body))
        .catchError((err) {
      return _isStatusCode(err, 409) ? _patchUser(body) : throw (err);
    });
  }

I'm using mockito, and tried first returning a Response like this:

when(http.post(argThat(startsWith(api)), body: anyNamed('body')))
        .thenAnswer((_) async => Response("user exists", 409);

And it works... kind of. I catch the error, but then I can't get the status code, I get only the message 'user exists'

If I change to the structure that the backend returns, which is {"error": { "code": 409 }} and I do this:

when(http.post(argThat(startsWith(api)), body: anyNamed('body')))
        .thenAnswer((_) async => Response(json.encode(fakeErrorResponse), 409);

Then my catch does not work anymore (??)

I tried then to return an error instead of a response, like this:

when(http.post(argThat(startsWith(api)), body: anyNamed('body')))
    .thenAnswer((_) => Future.error(fakeErrorResponse));

Now my catch works again, but the error I get is an _ImmutableMap and I see no easy way to retrieve my data from there.

How can I mock an http error that returns the body that I want and not a simple String?

Thanks

Aucun commentaire:

Enregistrer un commentaire