Тест Jasmine: Как проверить блокировку Promise.then()?

#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);
});
 

Приведенный мной код предназначен только для иллюстративных целей. Возможно, он не работает как есть.