如何使用Jasmine测试多个顺序调用 [英] How to test multiple sequential calls with Jasmine
问题描述
我正在尝试测试一个取消所有订阅退订的功能:
I am trying to test a function that unsubscribes from all subscriptions:
ngOnDestroy() {
this.tryUnsubscribe(this.carsSubscription);
this.tryUnsubscribe(this.partsSubscription);
this.tryUnsubscribe(this.shopsSubscription);
}
这是我为此功能编写的测试:
This is the test I wrote for the function:
it('should unsubscribe from subscriptions ', () => {
spyOn(component, "tryUnsubscribe");
component.ngOnDestroy();
expect(component.tryUnsubscribe).toHaveBeenCalledWith(component['carsSubscription']);
expect(component.tryUnsubscribe).toHaveBeenCalledWith(component['partsSubscription']);
expect(component.tryUnsubscribe).toHaveBeenCalledWith(component['shopsSubscription']);
});
问题:
如果我注释掉一个函数调用,则测试仍会通过.
If I comment out a function call, the tests still passes.
ngOnDestroy() {
this.tryUnsubscribe(this.carsSubscription);
//this.tryUnsubscribe(this.partsSubscription);
this.tryUnsubscribe(this.shopsSubscription);
}
仅当我注释掉所有这些函数调用时,测试才会失败:
Only if I comment out all of these function calls, the test fails:
ngOnDestroy() {
//this.tryUnsubscribe(this.carsSubscription);
//this.tryUnsubscribe(this.partsSubscription);
//this.tryUnsubscribe(this.shopsSubscription);
}
如何正确测试这种功能?我在做什么错了?
How to properly test this kind of function? What am I doing wrong?
推荐答案
我会将您的测试重写为以下内容:
I would rewrite your test to the following:
it('should unsubscribe from subscriptions ', () => {
const spy = spyOn(component, 'tryUnsubscribe');
component.ngOnDestroy();
// Check how many times the spy was called
expect(spy).toHaveBeenCalledTimes(3);
});
如果现在取消注释tryUnsubscribe
调用之一,则测试将失败,因为间谍仅被调用了两次.
If you now uncomment one of the tryUnsubscribe
calls, the test should fail as the spy was only called twice.
另一种方法是模拟订阅,或者只是将它们设置为虚拟值,以测试ngDestroy
tryUnsubscribe
内部是否使用了这三个组件变量:
Another approach would be to mock the subscriptions or just set them to a dummy value to test that inside the ngDestroy
tryUnsubscribe
was called with those 3 component variables:
it('test unsubscribing', () => {
// Mock values
component.carsSubscription = Observable.of(1).subscribe(() => {});
component.partsSubscription = Observable.of(1).subscribe(() => {});
component.shopsSubscription = Observable.of(1).subscribe(() => {});
const spy = spyOn(component, 'tryUnsubscribe').and.callThrough();
component.ngOnDestroy();
// Check how many times the spy was called
expect(spy).toHaveBeenCalledTimes(3);
// Check arguments
expect(spy.calls.all()[0].args[0]).toEqual(component.carsSubscription);
expect(spy.calls.all()[1].args[0]).toEqual(component.partsSubscription);
expect(spy.calls.all()[2].args[0]).toEqual(component.shopsSubscription);
});
此处 是该测试的一项有效工作.
Here is a working stackblitz with the test.
这篇关于如何使用Jasmine测试多个顺序调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!