typescript - Mocka en konfigurationsmodul med Jest
Jag försöker lägga till tester kring användningen av ett enkelt konfigurationsobjekt. Låt oss säga att jag har:
config.ts
export default {
foo: "bar",
};
app.ts
import config from "./config";
export default () => {
return config.foo;
};
app.test.ts
import App from "./app";
import config from "./config";
describe("App", () => {
beforeEach(() => {
jest.mock("./config", () => ({ default: { foo: "mock foo" } }));
});
it("returns a mocked value of config.foo", () => {
config.foo = "baz";
expect(App()).toBe("baz");
});
it("returns the default value of config.foo", () => {
expect(App()).toBe("bar");
});
});
Det andra testet misslyckas eftersom den riktiga konfigurationen har ändrats i det första testet, men jag vill att det ska misslyckas eftersom mocken i beforeEach har satt värdet till "mock foo". Jag tror att detta har något att göra med att config-exporten inte är en funktion, och därför kan jag inte göra något som jest.spyOn.... Men om det finns ett sätt att mocka ett objekt, skulle det spara mig en stor omstrukturering i projektet jag arbetar med!
Svar #1
Du kan använda jest.doMock(moduleName, factory, options) för att mocka ./config-modulen för varje testfall.
t.ex.
config.ts:
export default {
foo: 'bar',
};
app.ts:
import config from './config';
export default () => {
return config.foo;
};
app.test.ts:
describe('App', () => {
beforeEach(() => {
jest.resetModules();
});
it('returns a mocked value of config.foo', () => {
jest.doMock('./config', () => ({ foo: 'baz' }));
const App = require('./app').default;
expect(App()).toBe('baz');
});
it('returns the default value of config.foo', () => {
jest.doMock('./config', () => ({ foo: 'bar' }));
const App = require('./app').default;
expect(App()).toBe('bar');
});
});
enhetstestresultat:
PASS src/stackoverflow/65049305/app.test.ts (12s)
App
✓ returns a mocked value of config.foo (8ms)
✓ returns the default value of config.foo (1ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 13.288s
