Spec 没有期望 - Jasmine 测试回调函数
Spec has no expectations - Jasmine testing the callback function
我有一个使用 d3 timer
调用的方法。每当调用该方法时,该方法都会发出一个具有几个值的对象。
其中一个值随时间增加。我想编写一个测试来检查值是否按升序排列(即是否随时间增加)。
因此,为了解决这个问题,在我的测试中,我订阅了事件发射器,并且在订阅内部,我将接收到的对象推送到本地数组中。然后,我希望 array[i]
小于 array[i+1]
。我认为我的逻辑是完全正确的,但我不确定为什么我从 Jasmine 那里得到一个错误,说 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);
}
});
}));
我是不是做错了什么?我该如何应对这种情况?请指导我正确的方向。
谢谢。
一般来说,在测试异步回调函数时,在 promise 解决后期待测试的输出总是很重要的。您可以将 Angular 测试床框架的 tick()
与 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()
方面运气不佳,因此我没有将其包含在答案中。抱歉。
尝试使用 @angular/core/testing
中的 async
函数。它
Wraps a test function in an asynchronous test zone. The test will
automatically complete when all asynchronous calls within this zone
are done. Can be used to wrap an {@link inject} call.
请在下面找到代码示例:
it('...', async(inject([AClass], (object) => {
object.doSomething.then(() => {
expect(...);
})
});
您应该在 promise 的末尾使用 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')
})
)
希望对您有所帮助
我成功地使用 waitForAsync 来包装我的 it 函数。
it('should display correct data', waitForAsync(() => {
fixture.whenStable().then(() => {
// expect
});
}));
我有一个使用 d3 timer
调用的方法。每当调用该方法时,该方法都会发出一个具有几个值的对象。
其中一个值随时间增加。我想编写一个测试来检查值是否按升序排列(即是否随时间增加)。
因此,为了解决这个问题,在我的测试中,我订阅了事件发射器,并且在订阅内部,我将接收到的对象推送到本地数组中。然后,我希望 array[i]
小于 array[i+1]
。我认为我的逻辑是完全正确的,但我不确定为什么我从 Jasmine 那里得到一个错误,说 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);
}
});
}));
我是不是做错了什么?我该如何应对这种情况?请指导我正确的方向。
谢谢。
一般来说,在测试异步回调函数时,在 promise 解决后期待测试的输出总是很重要的。您可以将 Angular 测试床框架的 tick()
与 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()
方面运气不佳,因此我没有将其包含在答案中。抱歉。
尝试使用 @angular/core/testing
中的 async
函数。它
Wraps a test function in an asynchronous test zone. The test will automatically complete when all asynchronous calls within this zone are done. Can be used to wrap an {@link inject} call.
请在下面找到代码示例:
it('...', async(inject([AClass], (object) => {
object.doSomething.then(() => {
expect(...);
})
});
您应该在 promise 的末尾使用 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')
})
)
希望对您有所帮助
我成功地使用 waitForAsync 来包装我的 it 函数。
it('should display correct data', waitForAsync(() => {
fixture.whenStable().then(() => {
// expect
});
}));