Angular Модульное тестирование - проверка испускаемого значения из наблюдаемого с использованием мраморного тестирования - PullRequest
0 голосов
/ 23 марта 2020

Я создаю несколько юнит-тестов для приложения 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...