所以我有一项服务:
@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
来解决这个问题,但是假设我想使用Angular的inject
函数,这怎么可能完成了吗?
编辑:使用 Angular 的 async
和 fakeAsync
也没有达到目的,因为 Observable
的 timeout
尝试设置一个间隔,这在这些区域中是不允许的。
最佳答案
如果您想显式使用 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/