Javascript 如何使用jasmine在Angular 8中模拟回调函数来测试中的承诺
我有一个函数,它返回一个承诺并调用另一个函数,该函数将回调作为一个参数,但我不知道如何模拟回调函数或调用它的函数 我试图模拟的函数是我注入的服务中的“ListenanMessageWithCallback”,我还想模拟它调用的回调函数 我的实施:Javascript 如何使用jasmine在Angular 8中模拟回调函数来测试中的承诺,javascript,typescript,unit-testing,jasmine,angular8,Javascript,Typescript,Unit Testing,Jasmine,Angular8,我有一个函数,它返回一个承诺并调用另一个函数,该函数将回调作为一个参数,但我不知道如何模拟回调函数或调用它的函数 我试图模拟的函数是我注入的服务中的“ListenanMessageWithCallback”,我还想模拟它调用的回调函数 我的实施: async getUsername(): Promise<string> { return await new Promise<string>((resolve, reject) => { try
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);
}
})
}
我在运行测试时遇到以下错误:
Spy“ListenaMessageWithCallback”收到一个带有参数['catchUser',Function]的调用,但所有配置的策略都指定了其他参数
如何模拟回调函数及其调用函数
提前感谢。您收到了错误消息,因为您将
ListenaMessageWithCallback
spy配置为。withArgs('message')
,因此只有在使用参数'message'
调用该方法时,才会使用spy来代替该方法。但是,在您的服务代码中,该方法是通过'catchUser'
和回调函数调用的,而不是通过'message'
调用的,因此永远不会调用spy。如果删除.withArgs('message')
条件,则无论传递给实际方法的参数是什么,都将调用spy
一旦开始工作并调用spy,那么在spy的callFake
函数中,您可以获得传递到服务代码中方法的回调:
spyOn(电子控制器,'listenanMessageWithCallback')。和.callFake(
(msg,cb)=>{
expect(msg).toBe('catchUser');
expect(cb的类型).toBe('function');
//cb这是传递到服务中ListenaMessageWithCallback的cb
//代码,所以您需要自己在这里调用它,否则承诺将无法得到解决
cb('mockEvent','mockUsername');
}
);
您不能真正地模拟回调,因为它是服务中的局部变量,但是由于您可以在测试中获得它并手动调用它,您应该能够测试它的效果
不过,您需要准确地了解您的代码将要执行的操作,因为该回调将service.username
设置为传递给它的用户名,但在测试中,您似乎试图监视service.stripDomain
,并改为设置service.username
。所以看起来你需要准确地确定你要测试什么
显示
callFake
正在工作并允许您访问回调函数。非常感谢这帮助我解决了问题。我在尝试执行流程,一路上想到了模仿回调的可能性。使用您的解决方案,我能够测试回调的效果和承诺的解决方案。再次感谢。
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);
});