typescript - Jest mocka ett es6 namngivet importerat objekt


Jag skulle vilja veta hur jag kan imitera ett importerat objekt för att returnera ett falskt värde med Jest.

I det här fallet vill jag åsidosätta standardvärdet för timeout (5000) till 1000 för att krascha min funktion

// config.ts
export const config = {
  request: {
    timeout: 5000,
  },
};
// Test file
import * as config from './config';

describe('Requests', () => {
  beforeEach(() => {
    jest.mock('./config');
  });

  afterEach(() => {
    jest.resetAllMocks();
  });

  it('Force timeout value', () => {
    jest.mock('./config');
    config.request.timeout.mockReturnValueOnce(1000);

    expect(config.request.timeout).toEqual(1000); // FAIL: returns 5000 instead of 1000
  });
});

Tack!

Svar #1

UPPDATERAT SVAR

I det här fallet måste du använda Require istället för import (ESM).

// config.ts
export const config = {
  request: {
    timeout: 5000
  }
}

Testfilen kommer att se ut så här:

// Test file

describe('greetings', () => {
  beforeEach(() => jest.resetModules())

  describe('hello', () => {
    describe('when the language is set to galician', () => {
      it('returns galician for hi', () => {
        jest.mock('./config', () => ({ request: { timeout: 1000 } }))
        const { request } = require('./config')
        expect(request.timeout).toEqual(1000)
      })
    })

    describe('when the language is not set to galician', () => {
      it('returns hi', () => {
        jest.mock('./config', () => ({ request: { timeout: 2000 } }))
        const { request } = require('./config')
        expect(request.timeout).toEqual(2000)
      })
    })
  })
})

referens - https://medium.com/trabe/mocking-different-values-for-the-same-module-using-jest-a7b8d358d78b