У спецификации нет ожиданий - Жасмин тестирует функцию обратного вызова

У меня есть метод, который вызывается с помощью d3 timer. Каждый раз, когда вызывается метод, он генерирует объект с парой значений. Одно из значений со временем увеличивается. Я хотел бы написать тест, чтобы проверить, находятся ли значения в порядке возрастания или нет (т.е. увеличиваются со временем или нет).

Итак, чтобы решить эту проблему, в моем тесте я подписываюсь на эмиттер событий и внутри подписки я помещаю полученный объект в локальный массив. И затем, я ожидаю, что array[i] будет меньше, чем array[i+1]. Я думаю, что моя логика совершенно верна, но я не уверен, почему я получаю сообщение об ошибке от Жасмин, говоря, что the spec has no expectations, хотя она у меня есть.

Вот код:

let x = d3.timer((elapsed) => { 
    this.method(); // call the function
    if(elapsed >= 500) {
     x.stop(); // stops the timer.
    }
});

method(elapsed) {
 // do something
 if(elapsed > 500) {
   this.output.emit({x: somevalue, y: somevalue, f: increasingvalue });
 }
}

Спецификация жасмина:

it('my spec', inject([JumpService], (service: JumpService) =>{
  array = [];
  //service calls the method
  service.output.subscribe(e => {
   array.push(e);
   // A console statement here will give me the length and the object pushed.
   for(let i = 0; i< array.length - 1; i++) {
    expect(array[i].f).toBeLessThan(array[i+1].f);
   }

  });

}));

Я здесь что-то не так делаю? Как я могу справиться с подобным сценарием? Пожалуйста, направьте меня в правильном направлении.

Спасибо.


person zelda    schedule 08.08.2017    source источник
comment
Просто связанные; Я получил эту ошибку, потому что у меня был дополнительный индикатор функции стрелки, например it('does things', () => () => {   -  person dudeNumber4    schedule 10.03.2020


Ответы (4)


В общем, при тестировании функций обратного вызова async всегда важно ожидать результатов теста после выполнения обещаний. Вы можете использовать tick() фреймворка для тестирования Angular с fakeAsync() или просто вернуться к общему способу тестирования асинхронных методов Jasmine с помощью done()

Использование done():

it('my spec', (done) => {
  array = [];
  service.output.subscribe(e => {
   array.push(e);
   for(let i = 0; i< array.length - 1; i++) {
    expect(array[i].f).toBeLessThan(array[i+1].f);
   }
   done();
  });
});

Надеюсь, этот ответ поможет.

Примечание. Мне не повезло с fakeAsync() и tick(), поэтому я не включаю их в ответ. Извини за это.

person ShellZero    schedule 21.08.2017

Попробуйте использовать функцию async из @angular/core/testing. Это

Оборачивает тестовую функцию в асинхронную тестовую зону. Тест завершится автоматически, когда будут выполнены все асинхронные вызовы в этой зоне. Может использоваться для завершения вызова {@link inject}.

Пожалуйста, найдите пример кода ниже:

it('...', async(inject([AClass], (object) => {
  object.doSomething.then(() => {
   expect(...);
  })
});
person Aliaksei Maniuk    schedule 25.05.2018

Вы должны использовать done () в конце обещания, но из Jasmine 2.8.0 это не будет работать, потому что нет реализации для метода done (). Вы должны проверить свои обещания, например:

it('does test promise',
    inject([MyService], async (myService: MyService) => {
        const result = await myService.serviceToTest()
        expect(result).not.toBeNull()
        expect(result).toBe('Some Value')
     })
)

Надеюсь, это поможет тебе

person Cristian Zumelzu    schedule 23.10.2019

Мне удалось использовать waitForAsync, чтобы обернуть мою ИТ-функцию.

it('should display correct data', waitForAsync(() => {

    fixture.whenStable().then(() => {
      // expect 
    });
 }));
person brett    schedule 11.06.2021