angular - 测试可观察的完成情况

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

虽然我们预计测试会失败,但它成功完成,因为失败函数是在测试完成后调用的。

通常我们会用jasminedone来解决这个问题,但是假设我想使用Angular的inject函数,这怎么可能完成了吗?

编辑:使用 Angular 的 asyncfakeAsync 也没有达到目的,因为 Observabletimeout尝试设置一个间隔,这在这些区域中是不允许的。

最佳答案

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

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) => {
})

关于angular - 测试可观察的完成情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816624/

相关文章:

javascript - 如何在 Angular Material 中固定 mat-select-panel 的位置

angular - 使用 Cypress 测试 Angular 时如何防止整页重新加载?

node.js - 无法解析 Angular Universal 的依赖项

javascript - 如何测试销毁范围

typescript - Chutzpah 找不到变量

node.js - 将三个不同的函数映射到 Node.js 中的 Observable

angular - 使用 Ajax 数据表的 Angular 服务在组件之间共享数据

twitter-bootstrap - Angular 2 不导入 Bootstrap css

AngularJS + 测试 anchor 元素单击

javascript - 在订阅时重复调用 Angular 中的 http