0

I have a Promise.all with async calls to three different services and assigns the resulting lists to three variables

const { getList1 } = require('./module1');
const { getList2 } = require('./module2');
const { getList3 } = require('./module3');

...
const funcToTest = async (params) => {
...
const [list1, list2, list3] = await Promise.all([
    getList1(key),
    getList2(key),
    getList3(key),
  ]);
 // do some stuff

 //return promise
}

Here is the getList1 snippet

// ./module1
exports.getList1 = async (param1) => {
  ...

  try {
    // make a request that returns a list
    return list;
  } catch (err) {
    if ( err.statusCode === 404) {
      return [];
    }
    throw err;
  }
};

To test the function, the Jest case should reject with an error when module1's getList1 request fails

const app = require('../../app');
const module1 = require('../../module1');
const module2 = require('../../module2');
const module3 = require('../../module3');
const nerdStore = require('../../nerdStore');
...

// setup stuff 
jest.mock('../../module1');

beforeEach(() => {
  module1.getList1
    .mockResolvedValue([1,2,3]);

 // setup more mocks, stuff .etc

});

afterEach(() => {
  jest.clearAllMocks();
});
...
describe('Test funcToTest', () => {

  it('should reject with an error when an module1 getList1 fails', async () => {
    const errorMessage = 'An error occurred';

    module1.getList1
      .mockRejectedValue(new Error(errorMessage));

   
    const result = await app.funcToTest(testParams);

    await expect(result).rejects.toThrow(errorMessage);
  });

The jest test case fails and keeps returning the following


Test funcToTest › should reject with an error when an module1 getList1 fails

    An error occurred

      120 |
      121 |     module1.getList1
    > 122 |       .mockRejectedValue(new Error(errorMessage));
 expect(received).rejects.toThrow()

    Matcher error: received value must be a promise or a function returning a promise

    Received has value: undefined

      123 |
      124 |     const result = await app.funcToTest(testParams);
    > 125 |     await expect(result).rejects.toThrow(errorMessage);
          |                                  ^
      126 |   });

  Promise.allSettled([list1, list2, list3]).
  then((results) => results.forEach((result) => console.log(result.status)));

I ran the above and it kept saying fulfilled for all

How do you resolve the undefined issue, mock and assert a rejected promise so that it makes the jest test pass? Thanks

Ridhwaan Shakeel
  • 981
  • 1
  • 20
  • 39
  • You don't want to `await` the promise, you should pass it to `expect` instead: `const promise = await app.funcToTest(testParams); await expect(promise).rejects.toThrow(errorMessage);` – Bergi Nov 23 '22 at 04:05
  • 1
    Something is wrong with your mocking if this doesn't throw an error. – Bergi Nov 23 '22 at 04:05

0 Answers0