[英]Test that an Angular observable emits a value or sequence
我有一個服務創建一個可以發出值的observable,並且測試一個發出的值是否符合預期相對容易。
例如:
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 HAS NO EXPECTATIONS should be created”。
我搜索谷歌一段時間試圖弄清楚如何將這個案例作為一個錯誤抓住並提出了這種方法。
it('should emit true', async(() => {
const service = TestBed.get(MyService);
let value;
service.values$.subscribe((v) => value = v);
expect(value).toBeTruthy();
}));
以上只適用於同步觀察,並感覺像代碼聞到我。 另一位開發人員會看到這一點,並認為這是一個質量差的測試。
經過幾天考慮之后。 我想使用takeUntil()
強制observable完成然后測試預期的結果。
例如:
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);
}));
});
在上面的示例中,值存儲在局部變量中,然后在observable完成時檢查預期結果。 我使用帶有takeUntil()
afterEach()
強制完成。
題:
我的方法是否有任何副作用,如果是這樣,那么Angular / Jasmine執行這些測試的方式會更多。 我擔心你不想在afterEach()生命周期調用期間執行expect斷言。
這對我來說似乎有些過分。
Jasmine在測試中提供回調,您可以簡單地使用它嗎?
it('should X', doneCallback => {
myObs.subscribe(res => {
expect(x).toBe(y);
doneCallback();
});
});
如果未調用回調,則測試將失敗並顯示超時異常(意味着在此失敗后將不再運行測試)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.