Лучший способ проверить обещания в шутке
Если я что-то не так понял, разрешения и отклонения (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");
});