角度测试存根返回变量超时测试

时间:2017-11-22 07:16:24

标签: javascript angular unit-testing

所以我在单元测试中有一个服务存根,我需要为不同的测试更改返回值。我已经尝试使用间谍捕获并返回所需的值,但这没有用。目前我有一个relavent函数返回一个先前声明的变量,但是,这只会使每个测试超时,就好像永远不会返回一个值。

let schoolIn = false
const calandarServiceStub = {

  getSchedule(a) {
    return Promise.resolve()
  },
  // currentClass(a){
  //    return 'cu'
  // },
  next(a) {
    return 'nextu!'
  },
  convertTime(a, b) {
    return 650
  },
  isSchoolIn(a, b) {
    return schoolIn
  },
  needsInc(a, b) {
    return false
  },
  endsIn(a) {
    return 'endseen'
  }
}

错误

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
    at http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1973:23 [ProxyZone]
    at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvokeTask (http://localhost:9876/base/src/test.ts?debf1c3289163cfbc2c419b8e0e217abd44684a5:79544:39) [ProxyZone]
    at ZoneDelegate.invokeTask (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:1552:36) [ProxyZone]
    at Zone.runTask (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:1320:47) [<root> => ProxyZone]
    at ZoneTask.invoke (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:1615:38) [<root>]
    at timer (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:2695:29) [<root>]

当我这样写时:

  isSchoolIn(a, b) {
    return true
  },

一切正常,除非我需要该值为假。

1 个答案:

答案 0 :(得分:0)

试试这个:(calandarServiceStub.getSchedule as Spy).and.returnValue(Observable.of(true))

Observable.of马上回来!

这可以在每个必需的测试中完成,如果适用于所有测试,则可以在beforeEach中完成

更新

我意识到我的答案不够充分。 所以我会尽力做得更好:

我会嘲笑提供商的电话。这样我就不必创建存根,og使用spy.and.callFake

describe('Service', () => {
    beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        {
          provide: calandarService,
          useValue: {
            getSchedule: _ => Observable.of(false),
          },
        },
      ],
    });
  });

  beforeEach(()=>{
    ...
  });

});

如果你想监视al元素,你仍然可以这样做:const spy = spyon(serivce,'getSchedule');`

然后:expect(spy).toHaveBeenCalledTimes(1);