【问题标题】:testing observable completion测试可观察完成
【发布时间】:2016-10-02 11:41:55
【问题描述】:

所以我有一个服务:

@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 试图设置一个间隔,这在这些区域是不允许的。

【问题讨论】:

    标签: angular jasmine rxjs


    【解决方案1】:

    如果你想明确地使用done,你可以,但我不知道如何使它与inject 方法兼容。你可以做的是在beforeEach 中处理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) => {
    })
    

    【讨论】:

    • async 不起作用,它试图创建一个间隔(这可能是Observable.timeout 所做的)。你成功运行了吗?
    • 顺便说一句,我最终使用了你提到的最后一个解决方案,它确实有效。
    • 不,我没试过。您可以尝试代替async 的一件事是fakeAsync。您需要致电tick。您可以将毫秒延迟传递给tick 方法。也许这会奏效。也许async 不支持间隔。不知道,可能fakeAsync也行不通,不过你可以试试
    • 不,试过了。具有不同错误消息的类似问题。无论如何,谢谢,删除关于async的答案的第一部分,我会将其标记为答案。
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2018-01-03
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多