Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jasmine在Angular 8中模拟回调函数来测试中的承诺_Javascript_Typescript_Unit Testing_Jasmine_Angular8 - Fatal编程技术网

Javascript 如何使用jasmine在Angular 8中模拟回调函数来测试中的承诺

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

我有一个函数,它返回一个承诺并调用另一个函数,该函数将回调作为一个参数,但我不知道如何模拟回调函数或调用它的函数

我试图模拟的函数是我注入的服务中的“ListenanMessageWithCallback”,我还想模拟它调用的回调函数

我的实施:

  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);
  });