Проверьте, что наблюдаемая угловая точка испускает значение или последовательность - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть служба, которая создает наблюдаемое, которое излучает значения, и сравнительно легко проверить, соответствует ли полученное значение ожидаемому.

Например:

describe('service', () => {
    beforeEach(() => {
        TestBed.configureTestingModule({providers: [MyService]});
    });

    it('should emit true', async(() => {
        const service = TestBed.get(MyService);
        service.values$.subscribe((value) => expect(value).toBeTruthy());
    }));
});

Выше работаетдля проверки ожидаемого значения, но оно работает только в том случае, если служба фактически выдает значение.Если у вас есть крайний случай, когда службе не удается передать значение, тогда сам тест фактически проходит, и Жасмин записывает в журнал предупреждающее сообщение «СПЕЦИАЛЬНО НЕ ДОЛЖНЫ ОЖИДАТЬСЯ».

Я некоторое время искал в Googleчтобы понять, как отловить этот случай как ошибку и придумать этот подход.

    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() с takeUntil().

Вопрос:

Есть ли какие-либо побочные эффекты с моим подходом, и если да, то каковы будутУгловой / Жасмин способ выполнения этих видов испытаний.Меня беспокоит, что вы не должны выполнять ожидайте утверждений во время afterEach () вызова жизненного цикла.

1 Ответ

0 голосов
/ 18 декабря 2018

Это кажется мне излишним.

Жасмин предлагает обратный вызов в своих тестах, вы могли бы просто использовать его?

it('should X', doneCallback => {
  myObs.subscribe(res => {
    expect(x).toBe(y);
    doneCallback();
  });
});

Если обратный вызов не вызывается, тест завершается неудачей с исключением по тайм-ауту (то есть больше тест не будет выполняться после этого неудачного)

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