是否可以spyOn
帮助类?在下面的代码中,StatefulPatternService.init()
正在调用WebSocketHelper
。
我想窥探WebSocketHelper并模拟subscribeFn
export class WebSocketHelper{
private url: string;
constructor(url){
this.url = url;
init();
}
init(){
// init websocket & other login
}
}
@Injectable({
providedIn: 'root'
})
export class StatefulPatternService {
constructor(){}
private callback(_data){ }
init(){
let wsHelper = new WebSocketHelper('/subscribe/topic'); // <-- How to spyOn???
wsHelper.subscribeFn = this.callback;
// ...
}
}
如果不可能运行spyOn,那么如何重写它以便覆盖此测试?
答案 0 :(得分:0)
您的挑战将是掌握“ wsHelper”以便进行监视。一个想法:您可以重构以使wHelper成为类作用域变量吗?然后,当您在测试套件中获得服务时,可以窥探它,例如:
service = TestBed.get(StatefulPatternService);
let spy = spyOn(service.wsHelper, 'subscribeFn');
从评论到我的回答,看来您真正想要做的是验证是否使用正确的URL调用了构造函数。由于您将其保存在类变量中,因此无需监视构造函数,而只需测试保存的变量的值即可。正如我在评论中提到的那样,您需要做两件事:使wsHelper成为类级别的变量,并在WebSocketHelper类上添加一个返回私有变量“ url”的值的方法,以便对其进行测试。我已经设置了一个Stackblitz来演示我在这里谈论的内容:STACKBLITZ这是该Stackblitz的一个片段:
describe('MyService', () => {
let myService: StatefulPatternService;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [/* any imports needed */],
providers: [ StatefulPatternService ]
});
myService = TestBed.get(StatefulPatternService);
});
it('should be createable', () => {
expect(myService).toBeTruthy();
});
it('should construct wsHelper properly', () => {
myService.init();
expect(myService.wsHelper.get_url()).toEqual('/subscribe/topic');
})
});