Как мне структурировать мой код / ​​тесты мокко для функций генератора

Я начал создавать реактивный проект с реактив-редуксом, который использует мокко в качестве тестовой среды.

Чтобы справиться с асинхронными операциями, я недавно решил попробовать реагировать на саги. 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 строки вывода, в идеале, каждая с указанием, успешно это или нет?

0 ответов

Другие вопросы по тегам