【发布时间】:2020-01-10 17:28:53
【问题描述】:
我有一个函数返回一个承诺并调用另一个函数,该函数将回调作为参数,但我无法弄清楚如何模拟回调函数或调用它的函数。
我要模拟的函数是来自我正在注入的服务的“listenOnAMessageWithCallBack”,我还想模拟它调用的回调函数。
我的实现:
async getUsername(): Promise<string> {
return await new Promise<string>((resolve, reject) => {
try {
this.electronController.sendMessage('userName');
let cb = (event, username) =>{
this.username = username;
let user = this.stripDomain(this.username);
resolve(user);
};
this.electronController.listenOnAMessageWithCallBack('catchUser', cb);
} catch (err) {
reject(err);
}
})
}
我的测试如下:
it('testing function with callback', async() => {
const stripDomain = spyOn(service, 'stripDomain').and.callFake(()=>{
service.username = service.username.split('\\').reverse()[0];
return service.username;
});
let cb = (event, username)=>{Promise.resolve('username')}
spyOn(electronController, 'listenOnAMessageWithCallBack').withArgs('message').and.callFake(()=>{});
let username = await service.getUsername();
expect(username).toBe('username');
expect(stripDomain).toHaveBeenCalledTimes(1);
});
我在运行测试时收到以下错误: Spy 'listenOnAMessageWithCallBack' 收到了一个带有参数 ['catchUser', Function ] 的调用,但所有配置的策略都指定了其他参数。
如何模拟回调函数及其调用函数?
提前致谢。
【问题讨论】:
-
我只是想通过一些自定义实现来存根一个方法,并偶然发现了这篇文章,并且问题中使用的 callFake 想法有所帮助。
标签: javascript typescript unit-testing jasmine angular8