#javascript #angular #unit-testing #jasmine #karma-jasmine
#javascript #угловой #модульное тестирование #jasmine #карма-жасмин
Вопрос:
Я хочу протестировать сценарий, в котором я вызываю функцию (которая возвращает обещание), а в блоке then я вызываю другую функцию с именем ‘calledInThenBlock()’. Я хочу проверить, что при выполнении then block значение переменной компонента с именем count устанавливается равным 2, и вызывается calledInThenBlock() .
testIt(){
this.returnPromise().then((res)=>{
if(res.data[0].name=="Ankit"){
this.count=2;
this.calledInThenBlock();
}
}).catch(()=>{
this.calledInCatchBlock();
})
}
returnPromise(){
return Promise.resolve({data:[{name:"Ankit"}]});
}
Я не могу понять, как протестировать этот сценарий. Любые предложения будут оценены.
Спасибо!
Комментарии:
1.
testIt
долженreturn
ли обещать, чтобы его вызывающий мог его дождаться.2. Где код jasmine?
Ответ №1:
В вашем коде вы не ждете разрешения Promise.
testIt() {
// testIt() returns before the Promise returned by returnPromise() is
// resolved.
this.returnPromise().then((res) => {
if (res.data[0].name == "Ankit") {
this.count = 2;
this.calledInThenBlock();
}
}).catch(() => {
this.calledInCatchBlock();
})
}
it('test testIt()', () => {
testIt();
// okay, now how do I know when the Promise returned by returnPromise()
// is resolved? Or when the value of count will change?
// Of course, I can make it work by calling the assertions after an
// arbitrary amount of time, but it doesn't seem like the natural way
// of doing things.
});
Код вонючий. Клиент, от которого зависит testIt()
, будет ожидать, что узнает, когда выполняемая им работа завершится. Это также станет проблемой при написании модульных тестов. Любые утверждения, сделанные в тестовом примере после testIt()
вызова, могут быть оценены до разрешения Promise. Изменение вашей функции на следующую исправит это.
testIt() async {
try {
const res = await this.returnPromise(); // wait for the Promise to resolve
if (res.data[0].name == "Ankit") {
this.count = 2;
this.calledInThenBlock();
}
} catch (e) {
this.calledInCatchBlock();
}
}
Чтобы написать асинхронный тест, вы можете использовать async/await
с Jasmine для разрешения обещаний, возвращенных во время теста.
it('test Example#testIt()', async () => {
const example = new Example(); // or however you instantiate it.
await example.testIt(); // wait for the Promise to resolve
// followed by assertions to validate behaviour correctness.
expect(example.count).toEqual(2);
});
Приведенный мной код предназначен только для иллюстративных целей. Возможно, он не работает как есть.