Jest: может повторять макет реализации только при запуске одного теста - PullRequest
0 голосов
/ 17 мая 2018

У меня есть следующий упрощенный пример, где я вручную высмеиваю зависимость и заставляю ее возвращать разрешенное обещание.В одном из моих тестов я затем пытаюсь изменить его тип возврата на отклонение 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;

1 Ответ

0 голосов
/ 18 мая 2018

Это вызвано попыткой смоделировать зависимости Singleton.

При выполнении всех трех тестов используется исходная фиктивная реализация (которая разрешается), а затем она не заменяется второй фиктивной реализацией, которая отклоняет.

Стоит также отметить, что, поскольку отклоненное Обещание создано, но, следовательно, не обработано, это приводит к необработанному отклонению Обещания и сбою набора тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...