Spec没有期待——Jasmine测试回调函数

我有一个使用 d3 计时器 调用的方法.每当调用该方法时,该方法都会发出一个带有几个值的对象.其中一个值随时间增加.我想编写一个测试来检查这些值是否按升序排列(即是否随时间增加).

I have a method which is being called using a d3 timer. Whenever the method is called, the method emits an object with a couple of values. One of the values increases over time. I would like to write a test to check whether the values are in the ascending order or not (i.e., increasing over time or not).

因此,为了解决这个问题,在我的测试中,我订阅了事件发射器,在订阅中,我将收到的对象推送到本地数组中.然后,我期望 array[i] 小于 array[i+1].我认为我的逻辑是完全正确的,但我不确定为什么我从 Jasmine 那里得到一个错误,说 规范没有期望,即使我有一个.

So, to tackle this, In my test, I subscribe to the event emitter and inside the subscription, I am pushing the object which I receive into a local array. And then, I am expecting the array[i] to be less than the array[i+1]. I think my logic is perfectly correct but I am not sure why I am getting an error from Jasmine saying that the spec has no expectations even though I have one.

代码如下:

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

  });

}));

我在这里做错了吗?我该如何应对这种情况?请指导我正确的方向.

Am I doing anything wrong here? How can I tackle such kind of a scenario? Please guide me in a right direction.

谢谢.

推荐答案

一般来说,在测试异步回调函数时,在 promise 解决后期待测试的输出总是很重要的.您可以将 Angular 测试台框架的 tick()fakeAsync() 一起使用,或者您可以简单地回退到 Jasmine 使用 测试异步方法的一般方式完成()

In general, when testing the async callback functions, it is always important to expect the outputs of the test after the promises are resolved. You can use the Angular test bed framework's tick() with the fakeAsync() or you can simply fallback to the Jasmine's general way of testing the async methods by using 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();
  });
});

希望这个答案有所帮助.

Hope this answer helps.

注意:我对 fakeAsync()tick() 的运气并不好,所以我没有将其包含在答案中.对此感到抱歉.

Note: I didn't had great luck with the fakeAsync() and tick(), so I am not including it in the answer. Sorry about that.

相关文章