Как мне структурировать мой код / тесты мокко для функций генератора
Я начал создавать реактивный проект с реактив-редуксом, который использует мокко в качестве тестовой среды.
Чтобы справиться с асинхронными операциями, я недавно решил попробовать реагировать на саги. React-saga использует функции генератора ES6. Я считаю, что это гораздо проще проверить, так как это избавляет меня от проблем с насмешкой.
Однако у меня возникают трудности с структурированием тестов таким образом, чтобы получить вывод, который я считаю читабельным. В учебном пособии, разработанном разработчиками, они используют ленту, которая в основном позволяет каждому утверждению создавать свой собственный вывод. Я нахожу это довольно хорошим, так как я могу создать вывод для каждого шага в саге.
Есть ли какой-то способ добиться аналогичного результата с мокко. Создание нескольких "это", кажется, не вариант, поскольку это потребует их запуска в определенном порядке.
Подход к вводу того, что все шаги делают как текст для "этого", также не кажется практичным. Единственное решение, которое я мог бы придумать, это создать отдельное его и вызывать следующий на генераторе все большее число раз и утверждать последнее значение, что также не очень практично, особенно если некоторые шаги извлекают данные.
Поскольку я довольно новичок в javascript, я могу пропустить что-то очевидное здесь. Кто-нибудь может указать мне правильное направление?
Изменить 08/14: Добавить пример для уточнения:
Давайте возьмем пример, приведенный в руководстве:
import { put, call } from 'redux-saga/effects'
import { delay } from 'redux-saga'
export function* incrementAsync() {
// use the call Effect
yield call(delay, 1000)
yield put({ type: 'INCREMENT' })
}
С лентой они проверяют это так
test('incrementAsync Saga test', (assert) => {
const gen = incrementAsync()
assert.deepEqual(gen.next().value, call(delay, 1000), 'message 1')
assert.deepEqual(gen.next().value, put({type: 'INCREMENT'}), 'message 2')
assert.deepEqual(gen.next(), { done: true, value: undefined }, 'message 3')
assert.end()
});
Когда я пытаюсь написать это для мокко с чай, это будет выглядеть так:
describe('incrementAsync', () => {
it('waits for a second, dispatches \'INCREMENT\' and is done afterwards', () => {
const gen = incrementAsync()
expect(gen.next().value).to.deep.equal(call(delay, 1000))
expect(gen.next().value).to.deep.equal(put({type: 'INCREMENT'})
expect(gen.next()).to.deep.equal({ done: true, value: undefined });
})
})
Хотя это выглядит хорошо для нескольких шагов, я бы предпочел не терять возможность выводить то, что я назвал "сообщениями" от 1 до 3, в примере, потому что если в саге больше нескольких шагов, сообщение получится очень длинным.
Так что я ищу что-то вроде следующего, который является анти-паттерном, если я не ошибаюсь, так как каждое "это" не должно полагаться на глобальное состояние, которое изменяется последовательно.
describe('incrementAsync', () => {
var gen;
before(() => {
gen = incrementAsync()
})
it('waits for a second', () => {
expect(gen.next().value).to.deep.equal(call(delay, 1000))
})
it('then dispatches \'INCREMENT\'', () => {
expect(gen.next().value).to.deep.equal(put({type: 'INCREMENT'})
})
it('is done afterwards', () => {
expect(gen.next()).to.deep.equal({ done: true, value: undefined });
})
})
Так что мой вопрос, есть ли хороший способ сделать это и создать 3 строки вывода, в идеале, каждая с указанием, успешно это или нет?