测试可观察的完成情况

时间:2016-10-02 11:41:55

标签: angular jasmine rxjs

所以我有一项服务:

@injectable()
export class MyService {
    public go() : Observable { /* does not complete returned observable */ }
}

我对其方法的可观察完成情况进行了测试:

it('should complete', inject([MyService], (s : MyService) => {
     s.go()
      .timeout(10, 'did not complete')
      .subscribe(
           undefined,
           // if observable failed on timeout, fail test
           e => e == 'did not complete' && fail(e)
       );
}));

虽然我们希望测试失败,但它会成功完成,因为在测试完成后调用了失败函数。

通常我们会使用jasmine done来解决此问题,但假设我想使用角度inject函数,那怎么能完成?

修改:使用有角度的asyncfakeAsync也没有做到这一点,因为Observable' s timeout试图设置间隔,这些区域是不允许的。

1 个答案:

答案 0 :(得分:3)

如果您想明确使用done,可以,但我不知道如何使其与inject方法兼容。您可以做的是处理inject中的beforeEach,或者您可以从测试台获取服务(其作用类似于注射器)

使用beforeEach

let service;

beforeEach(inject([MyService], (s : MyService) => {
    service = s;
}))

it('...', (done) => {
})

从试验台获得服务:

import { getTestBed } from '@angular/core/testing';

let service;    
beforeEach(() => {
  TestBed.configureTestingModule({
    ...
  })
  let injector = getTestBed();
  service = injector.get(MyService);
})

it('...', (done) => {
})