我有一个服务,它创建了一个可观察到的值,并且它相对容易测试一个发射值是否如预期的那样。
例如:
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()
具有
获取()
.
问题:
我的方法是否有任何副作用,如果有,执行这些测试的角度/茉莉花的方法是什么?我担心你不能表演
期待
期间的断言
后()
生命周期呼叫。