У меня есть следующий упрощенный пример, где я вручную высмеиваю зависимость и заставляю ее возвращать разрешенное обещание.В одном из моих тестов я затем пытаюсь изменить его тип возврата на отклонение Promise.
Если я выполню все 3 теста вместе, они не пройдут, потому что вызов в тесте для отклонения фактически разрешается.Однако, если я изменю строку 17 в спецификации на it.only('should reject if the client fails to load'
, то одиночный тест пройдет.
Что я делаю не так?
service.js
:
import client from './client';
const service = (() => {
let instance;
const makeCall = () => {
return true;
};
const init = async () => {
const _client = await client();
return Promise.resolve({
makeCall,
});
};
const getInstance = async () => {
if (!instance) {
instance = await init();
}
return Promise.resolve(instance);
};
return {
getInstance,
};
})();
export default service;
client.js
:
const client = () => Promise.resolve('Real');
export default client;
__test__/service.spec.js
:
import client from '../client';
import service from '../service';
jest.mock('../client');
describe('Service', () => {
it('should return a singleton', () => {
expect(service.getInstance()).toEqual(service.getInstance());
});
it('should resolve if the client successfully loads', async () => {
expect.assertions(1);
await expect(service.getInstance()).resolves.toHaveProperty('makeCall');
});
it('should reject if the client fails to load', async () => {
const errorMessage = 'Client could not be initialised.';
expect.assertions(1);
client.mockReturnValueOnce(Promise.reject(new Error(errorMessage)));
await expect(service.getInstance()).rejects.toHaveProperty(
'message',
errorMessage
);
});
});
__mocks__/client.js
:
const client = jest.fn();
client.mockImplementation(() => {
return Promise.resolve('Mock file');
});
export default client;