单元测试一个带有返回值的函数

问题描述 投票:0回答:2

我有一个要进行单元测试的函数,我不知道该如何处理。

someFunction(): boolean {
 this.service.login().subscribe(response => {
  if (response) {
    return someOtherFunction();
  }
 });
}

someOtherFunction(): boolean {
 this.service.otherTask().subscribe(response => {
  if (response) {
    return true;
  }
 });
}

我想测试的结果是 someFunction 在这种情况下。然而,这并不奏效。

describe('someFunction', () => {
  it('returns true', () => {
   serviceSpy.login.and.returnValue(of({response: response}));
   serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
   result = component.someFunction();
   expect(result).toEqual(true);
 });
});

ServiceSpy在这块之前就已经被配置好了. 我可以看到函数被执行并且返回true. 然而,此刻我要求的是 result但它仍然是未定义的。测试框架没有等待所有的事情完成。我试过使用async、fakeAsync、done(),但这些都没有用。someFunction?

angular observable karma-jasmine testbed
2个回答
1
投票

问题是在函数内部,它们在函数的内部返回结果。subscribe那是行不通的,你需要返回一个观测值或者使用一个局部变量。

someFunction(): Observable<boolean> {
 return this.service.login().pipe(
   first(),
   switchMap(res => res ? this.someOtherFunction() : of(undefined)),
 );
}

someOtherFunction(): Observable<boolean> {
 return this.service.otherTask().pipe(
   first(),
   map(response => !!response),
 );
}

然后在你的测试中,你可以做

describe('someFunction', (done) => {
  it('returns true', () => {
   serviceSpy.login.and.returnValue(of({response: response}));
   serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
   component.someFunction().subscribe(result => {
     expect(result).toEqual(true);
     done();
   });
 });
});

0
投票

从@satanTime的回答和评论中得到启发,再加上在网上搜索了一下,我编辑了我的代码,测试如下。someOtherFunction 似乎没有任何问题的订阅,所以我在简化中省略了它。

someFunction(): Observable<boolean> {
 return this.service.login().pipe(map(response => {
  if (response) {
    return someOtherFunction();
  }
 }));
}

someOtherFunction(): boolean {
    return true;
}

测试。

describe('someFunction', () => {
  it('returns true', (done) => {
   serviceSpy.login.and.returnValue(of({response: response}));
   serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
   component.someFunction().subscribe(result => {
   expect(result).toEqual(true);
   done();
   });
 });
});
© www.soinside.com 2019 - 2024. All rights reserved.