Когда вы подписываетесь с rx js, как вы сигнализируете своему тесту, если он не прошел? - PullRequest
0 голосов
/ 07 апреля 2020

Я полный новичок. Проблема, с которой я сталкиваюсь, заключается в том, что, как только я выдаю ошибку в rx js наблюдаемую, мой тест об этом не знает. Когда я подписываюсь в тесте, и он терпит неудачу в течение rx js, он просто выдает ошибку, и мне нужно уведомить мой тест о том, что ошибка произошла. Вот более простой пример, показывающий, что «тест не пройден» никогда не печатается.

import { sample } from "rxjs/operators";
const source = interval(1000);
// sample last emitted value from source every 2s
// output: 2..4..6..8..
const example = source.pipe(sample(interval(2000)));
async function test_runner() {
    setup();
    try {
        await test();
        console.log("test succeeded");
    } catch (e) {
        console.log("test failed");
    }
}
async function setup() {
    console.log("setup");
    const subscribe = example.subscribe((val) => {
        console.log(val);
        if (val === 4) {  throw Error("error!"); }
    });
}
async function test() {
    console.log("test");
    await waitMs(10000);
}

test_runner();

async function waitMs(waitTime: number): Promise<void> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        }, waitTime);
    });
}

Есть ли способ справиться с этим? Я ценю любую помощь.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Когда вы подписываетесь, вы можете передавать функции:

  • обрабатывать элементы, генерируемые потоком
  • обрабатывать ошибку
  • обрабатывать сигнал завершения

Вы можете использовать это и в своих тестах:

describe('when a stream emits an error', () => {
  it('should call your error handler', () => {
    const stream$ = throwError('wat?!');
    stream$.subscribe({ error: (err) => {
      chai.expect(err === 'wat?!').to.be.true;
    }});
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.min.js"></script>
<script src="https://unpkg.com/chai/chai.js"></script>
<script src="https://unpkg.com/mocha/mocha.js"></script>
<script>const {throwError} = rxjs;</script>

<div id="mocha"></div>

<script class="mocha-init">mocha.setup('bdd');</script>
<script class="mocha-exec">mocha.run();</script>
1 голос
/ 07 апреля 2020

Если вы хотите протестировать rx-потоки, одним из лучших способов является использование диаграммы мрамора. Это то, что ngrx использует для тестирования эффектов.

https://www.npmjs.com/package/jasmine-marbles https://github.com/ngrx/platform/blob/master/docs/effects/testing.md

С диаграммой мрамора вы можете написать стиль там, где вы ожидаете emit / ошибка и ее утверждение.

Например, синтаксис hot('---#') означает, что через 30 мс в потоке возникает ошибка.

...