Лучший способ проверить обещания в шутке

Если я что-то не так понял, разрешения и отклонения (https://facebook.github.io/jest/docs/expect.html#resolves) не будут доступны до vNext. Каков сейчас/в настоящее время рекомендуемый способ проверки обещаний с помощью Jest? Это просто помещает ожидания в то время и ловит?

Например:

describe('Fetching', () => {
    const filters = {
        startDate: '2015-09-01'
    };
    const api = new TestApiTransport();

    it('should reject if no startdate is given', () => {
        MyService.fetch().catch(e => expect(e).toBeTruthy()); // see rejects/resolves in v20+
    });            

    it('should return expected data', () => {
        MyService.fetch(filters, null, api).then(serviceObjects => {
            expect(serviceObjects).toHaveLength(2);
        }).catch(e => console.log(e));
    });            
});

ОБНОВЛЕНИЕ 15 июня 2019: Вскоре после того, как я отправил этот вопрос, Джест начал поддерживать это из коробки. Я изменил принятый ответ ниже, чтобы отразить лучший на данный момент способ сделать это.

Ответы

Ответ 1

В наше время вы также можете написать это так: docs

describe('Fetching', () => {
    const filters = {
        startDate: '2015-09-01'
    };
    const api = new TestApiTransport(); 

 it('should reject if no startdate is given', () => {
   expect.assertions(1);
   return expect(MyService.fetch()).rejects.toEqual({
     error: 'Your code message',
   });
 });          


 it('should return expected data', () => {
   expect.assertions(1);
   return expect(MyService.fetch(filters, null, api)).resolves.toEqual(extectedObjectFromApi);
 });            
});

Обновление (06.01.2019)

Согласитесь, что принятый ответ не работает должным образом, как expect.assertions(1); строки expect.assertions(1); делает всю магию. Ссылка на документы

Аргумент wait.assertions (число) проверяет, что во время теста вызывается определенное количество утверждений. Это часто полезно при тестировании асинхронного кода, чтобы убедиться, что утверждения в обратном вызове действительно вызваны.

Таким образом, размещение этой строки в верхней части будет контролировать то, что определенное количество утверждений будет сделано ко времени запуска теста.

Ответ 2

Либо вернуть обещание и ожидать в resolve или catch

describe('Fetching', () = > {
  const filters = {
    startDate: '2015-09-01'
  };
  const api = new TestApiTransport();
  it('should reject if no startdate is given', () = > {
    return MyService.fetch()
      .catch (e => expect(e).toBeTruthy()); // see rejects/resolves in v20+
  });
  it('should return expected data', () = > {
    return MyService.fetch(filters, null, api)
      .then(serviceObjects => {
        expect(serviceObjects).toHaveLength(2);
      })
  });
});

или используя async/await

describe('Fetching', () = > {
  const filters = {
    startDate: '2015-09-01'
  };
  const api = new TestApiTransport();
  it('should reject if no startdate is given', async() = > {
    try {
      const r = await MyService.fetch()
    } catch (e) {
      expect(e).toBeTruthy()
    }
  });
  it('should return expected data', async() = > {
    const serviceObjects = await MyService.fetch(filters, null, api)
    expect(serviceObjects).toHaveLength(2);
  });
});

Ответ 3

Я смог протестировать JEST с AXIOS для вызовов HTTP REST, как это.

it('has an API worth testing', async () => {
  let httpResult = null;
  await callThefunctionThatReturnsPromiseToMakeTheAxiosApiCall()
    .then(function(result) {httpResult=result;})
    .catch(function(err) {httpResult=err;});
  expect(httpResult.data.myData).toBe("myExpectedValue");
});

или же

it('has an API worth testing', async () => {
  let httpResult = await callThefunctionThatReturnsPromiseToMakeTheAxiosApiCall();
  expect(httpResult.data.myData).toBe("myExpectedValue");
});