代码之家  ›  专栏  ›  技术社区  ›  Reactgular

测试角可观测发射值或序列

  •  1
  • Reactgular  · 技术社区  · 7 年前

    我有一个服务,它创建了一个可观察到的值,并且它相对容易测试一个发射值是否如预期的那样。

    例如:

    describe('service', () => {
        beforeEach(() => {
            TestBed.configureTestingModule({providers: [MyService]});
        });
    
        it('should emit true', async(() => {
            const service = TestBed.get(MyService);
            service.values$.subscribe((value) => expect(value).toBeTruthy());
        }));
    });
    

    上面的工作是测试期望值,但它只在服务实际发出值时工作。如果您有服务未能发出值的边缘情况,那么测试本身实际上是通过的,Jasmine会记录警告消息“spec不应该创建期望值”。

    我在谷歌搜索了一段时间,试图找出如何把这个案例当作一个错误来处理,然后想出了这个方法。

        it('should emit true', async(() => {
            const service = TestBed.get(MyService);
            let value;
            service.values$.subscribe((v) => value = v);
            expect(value).toBeTruthy();
        }));
    

    以上仅适用于 同步的 在我看来就像是代码的味道。另一个开发人员会看到这一点,并认为这是一个糟糕的质量测试。

    所以在考虑了几天之后。我想用 takeUntil() 迫使可观测数据完成,然后测试预期结果。

    例如:

    describe('service', () => {
        let finished: Subject<void>;
    
        beforeEach(() => {
            TestBed.configureTestingModule({providers: [MyService]});
            finished = new Subject();
        });
    
        afterEach(() => {
            finished.next();
            finished.complete();
        });
    
        it('should emit true', async(() => {
            const service = TestBed.get(MyService);
            let value;
            service.changes$
                .pipe(
                    takeUntil(finished),
                    finalize(() => expect(value).toBeTruthy())
                )
                .subscribe((v) => value = v);
        }));
    });
    

    在上面的例子中,这个值被存储在一个局部变量中,然后当观测完成时检查预期的结果。我用 afterEach() 具有 获取() .

    问题:

    我的方法是否有任何副作用,如果有,执行这些测试的角度/茉莉花的方法是什么?我担心你不能表演 期待 期间的断言 后() 生命周期呼叫。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Maryannah    7 年前

    对我来说,这似乎太过分了。

    Jasmine在测试中提供了一个回调,您可以简单地使用它吗?

    it('should X', doneCallback => {
      myObs.subscribe(res => {
        expect(x).toBe(y);
        doneCallback();
      });
    });
    

    如果未调用回调,则测试将失败,并出现超时异常(这意味着在此失败的测试之后将不再运行任何测试)。