【问题标题】:How to mock function with callback and return type in Jasmine如何在 Jasmine 中使用回调和返回类型模拟函数
【发布时间】:2021-08-12 10:44:06
【问题描述】:

我正在尝试模拟具有流返回类型和回调为 arg 的函数。我得到了超时,因为回调函数永远不会被调用。

这是我要测试的功能:

 public setServerUrls(): Observable<void> {
    const obs: Observable<void> = new Observable((observer: Observer<void>) => {
      const stream: ClientWritableStream<Util.Server> = this.fileTransferClient.setURLs((error: ServiceError, response) => {

        if (error) {
          observer.error(`TransferManager Electron: unable to set server urls error: ${error.message}.`);
        }
        observer.next();
        observer.complete();
        logger.info(`TransferManager Electron: setting URLs completed.`);
      });

      const transferRequest = new Util.Server();
      transferRequest
        .setIp('localhost')
        .setTransferport('9092')
        .setUuid('4020a522-81fe-4996-b637-0620ae656d29');
      stream.write(transferRequest);
      stream.end();
    });

    return obs;
  }

我的茉莉花设置:

 const settingStream = {
      write: () => { },
      end: () => { }
    };

    const callBack = () => {
      return;
    };

    const f = function (callback: Function): any {
      return settingStream;
    };

    mockFileTransferClient = jasmine.createSpyObj('FileTransferClient', {
      subscribe: () => mockFileTransferStream,
      uploadFile: () => duplexStream,
      setURLs: f(callBack)
    });

    mockFileTransferClientWrapper.createNewFileTransferClient.and.returnValue(mockFileTransferClient as any);

// Question here... does not work!
mockFileTransferClient.setURLs.and.returnValue(settingStream);

测试:

   it('should set urls', done => {
      transferManager.setServerUrls()
        .subscribe(
          x => {
            expect(x).toBeDefined();
            done();
          }
        );
    });

这是 Elctron + grpc 功能测试。 测试超时,因为它永远不会进入回调并且 observable 永远不会完成。 我不知道如何用返回值和回调模拟setURLs

【问题讨论】:

    标签: unit-testing mocking jasmine


    【解决方案1】:

    您必须先模拟您的 setUrls 以返回已解析的 observable。

    我认为您需要在处理异步测试时使用 fakeAsync() 功能。将 Tick 与 fakeAsync 一起使用可确保所有挂起的异步活动都将完成。在您的情况下,它将等待 setTimeout。

    请注意,您还应该使用 TestBed.inject 注入 setServerUrls...

    所以我认为你的测试应该是这样的

    it("should .....", fakeAsync(() => {
    
     // Arrange - mock functions
    
     // Act - Make a call to the function
    
     // Use tick() after making call to the function which will flush your setTimeouts
    
    // Assert 
    }));
    

    欲了解更多信息,see the fakeAsync documentation

    【讨论】:

    • 我很抱歉应该添加测试。 setServerUrls 是 SUT。我不喜欢使用 Angular 测试助手进行服务测试。我正在使用subscribedone 类。问题是我不知道如何使模拟 mockFileTransferClient setURLs 返回值并运行回调函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多