Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spec has no expectations - Jasmine testing the callback function

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).

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.

Here is the code:

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

The Jasmine Spec:

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.

Thank you.

like image 474
zelda Avatar asked Aug 08 '17 22:08

zelda


People also ask

What do you mean by no expectations specification?

Explanation: No exception specification that it can throw anything.

How do you check the non desired output which function used in Jasmine?

toEqual() works exactly opposite to toEqual(). not. toEqual() is used when we need to check if the value does not match with the output of any function. We will modify the above example to show how this works.

What is test suite in Jasmine?

In terms of Jasmine, a test consists of one or more suites. A suite is declared with a describe block: describe('Suite description', () => { /* … */ }); Each suite describes a piece of code, the code under test.


1 Answers

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()

Using 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.

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

like image 115
ShellZero Avatar answered Sep 21 '22 17:09

ShellZero