Я создаю несколько юнит-тестов для приложения Angular, которое у меня есть. Мне удалось без проблем протестировать сервисы, которые делают HTTP-вызовы. Теперь я перешел на другой вид сервиса, который показан ниже.
Код
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { UICoupon } from '../models';
@Injectable()
export class ClaimCouponService {
hasClaimedCoupons = false;
claimedCoupons: UICoupon[] = [];
onClaimCoupons: Observable<UICoupon[]>;
private couponsUpdate: Subject<UICoupon[]> = new Subject<UICoupon[]>();
constructor() {
this.onClaimCoupons = this.couponsUpdate.asObservable();
}
claimCoupon(coupon: UICoupon) {
if (!coupon.claimed) {
coupon.claimed = true;
this.claimedCoupons.push(coupon);
}
this.hasClaimedCoupons = true;
this.couponsUpdate.next(this.claimedCoupons);
}
}
Мне удалось протестировать логи c для этого сервиса используя «шаблон подписки / утверждения». Используя приведенный ниже код:
...
it('should claim a coupon', (done) => {
claimCouponsService.onClaimCoupons
.subscribe(claimedCoupons => {
expect(claimedCoupons).toEqual([mockData[0]]);
done();
});
claimCouponsService.claimCoupon(mockData[0]);
});
Вышеуказанное работает хорошо, однако я занимался исследованиями, и мне было интересно узнать о тестировании мрамора. Я прочитал несколько статей, и мне нравится, как logi c структурирован в тесте. Я пытался воспроизвести вышеупомянутый тест с помощью Marble Testing, но в моем случае я не смог найти способ проверить, что выводится из службы после запуска функции claimCoupon(...)
.
let scheduler: TestScheduler;
let claimCouponsService: ClaimCouponsService;
...
it('should claim a coupon', (done) => {
const expectedObservable = claimCouponsService.onClaimCoupons;
scheduler.run(runHelpers => {
claimCouponsService.claimCoupon(mockData[0]);
const expectedMarble = '^a|';
const expectedData = { a: [mockData[0]] };
runHelpers.expectObservable(expectedObservable)
.toBe(expectedMarble, expectedData);
});
});
Я почти уверен, что это возможно, но у меня есть какая-то ошибка в моем тесте - или я не совсем понял, как работает тестирование мрамора. Вышеуказанное приводит к ошибке Expected $.length = 0 to equal 1.
, которая, я думаю, означает, что наблюдаемая не получила никаких значений. Я знаю, что тест, который я написал, проходит успешно, однако мне любопытно посмотреть, как можно использовать Marble Testing.