简体   繁体   中英

test rejecting an axios promise

I am trying to figure out how to correctly mock this code. I have figured out how to mock a success, but I cannot figure out how to mock the catch/reject block.

App code:

function getData(url = '') {
  return new Promise((resolve, reject) => {
    axios
      .get(`${baseURL}${url}`)
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err);
      });
  });
}

in testing I have:

import axios from 'axios';
const MockAdapter = require('axios-moc-adapter');

describe('getData', () => {
  it('test success', async () => {
    const mock = new MockAdapter(axios);

    mock.onGet(`${service.baseURL}/sites`).reply(200, 'success');
    const axiosSpy = jest.spyOn(axios, 'get');

    const rtn = await service.getData('/sites');

    expect(axiosSpy).toHaveBeenCalled();
    expect(rtn).toBe('success');
  });
  it('test failure', async () => {
    const mock = new MockAdapter(axios);

    mock.onGet(`${service.baseURL}/sites`).networkError();
    const rtn = await service.getData('/sites').catch((err) => {
      expect(err.message).toBe('message');
    });
    expect(rtn).toBe(undefined);
  });
});

The test success test works, but when I test the failure, I get:

    Expected: "message"
    Received: "Cannot read properties of undefined (reading 'then')"

      29 |     mock.onGet(`${service.baseURL}/sites`).networkError();
      30 |     const rtn = await service.getData('/sites').catch((err) => {
    > 31 |       expect(err.message).toBe('message');
         |                           ^
      32 |     });
      33 |     expect(rtn).toBe(undefined);
      34 |   });

How can I write a test that successfully passes the failure case? Specifically, I can make this test pass by not checking inside the catch block, but when I run coverage, it doesn't cover the catch block in the App code. How can I correctly cover this line?

Can't reproduce your issue, but .networkError() will throw an error with 'Network Error' message rather than 'message' , see source code index.js#L141

service.ts :

import axios from 'axios';

export const baseURL = 'http://localhost:3000/api';
export function getData(url = '') {
  return new Promise((resolve, reject) => {
    axios
      .get(`${baseURL}${url}`)
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err);
      });
  });
}

service.test.ts :

import * as service from './service';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

describe('getData', () => {
  it('test success', async () => {
    const mock = new MockAdapter(axios);

    mock.onGet(`${service.baseURL}/sites`).reply(200, 'success');
    const axiosSpy = jest.spyOn(axios, 'get');

    const rtn = await service.getData('/sites');

    expect(axiosSpy).toHaveBeenCalled();
    expect(rtn).toBe('success');
  });
  it('test failure', async () => {
    const mock = new MockAdapter(axios);
    mock.onGet(`${service.baseURL}/sites`).networkError();
    const rtn = await service.getData('/sites').catch((err) => {
      expect(err.message).toBe('Network Error');
    });
    expect(rtn).toBe(undefined);
  });
  it('test failure 2', async () => {
    const mock = new MockAdapter(axios);

    mock.onGet(`${service.baseURL}/sites`).networkError();
    await expect(service.getData('/sites')).rejects.toThrowError('Network Error');
  });
});

test result:

 PASS  examples/69947398/service.test.ts (8.89 s)
  getData
    ✓ test success (5 ms)
    ✓ test failure (1 ms)
    ✓ test failure 2 (2 ms)

------------|---------|----------|---------|---------|-------------------
File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------|---------|----------|---------|---------|-------------------
All files   |     100 |        0 |     100 |     100 |                   
 service.ts |     100 |        0 |     100 |     100 | 4                 
------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       3 passed, 3 total
Snapshots:   0 total
Time:        9.52 s

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM