Как мне проверить сагу, которая экспортирует множество эффектов? - PullRequest
0 голосов
/ 04 октября 2018

Все примеры сагового тестирования, которые я видел, включают в себя тестирование генератора функций, но я испытываю немало времени, пытаясь протестировать файл, который экспортирует массив эффектов избыточности.Вот простая репликация того, с чем я работаю:

// file: mysaga.js
export default [
  call(takeEvery, 'startClock', startIt)
]

export function* startIt() {
  while ( true ) {
    yield call(delay, 1000)
  }
}

И тестовый файл ...

// file: mysaga-test.js
import MySagas, { startIt } from './mysaga'

describe('MySaga', () => {
  // Using bdd-lazy-var
  subject(mySagaWrapper())

  it('takes every `startClock`', () => {
    expect($subject.next().value).to.eql(call(takeEvery, 'startClock', startIt))
  })

  it('invokes a delay', () => {
    expect($subject.next().value).to.eql(call(delay, 1000))
  })
})

function* mySagaWrapper() {
  yield* MySagas
}

Когда я запускаю тест, получаемые результаты выглядят какthis:

MySaga
  ✓ takes every `startClock`
  1) invokes a delay


1 passing (2ms)
1 failing

1) ClockSagas
     invokes a delay:
   AssertionError: expected undefined to deeply equal { Object (@@redux-saga/IO, CALL) }
    at Context.<anonymous> (...)

Как проверить, что будет после takeEvery?

Кроме того, я бы предпочел не экспортировать *startIt(), поскольку он на самом деле не является частьюпубличный API этого файла, так что я тоже хочу найти решение этой проблемы.

1 Ответ

0 голосов
/ 05 октября 2018

Ключ в основном просто для непосредственного тестирования генератора функций (startIt(), ниже):

import MySaga, {
 startIt,
} from './mysaga'

describe('MySaga', () => {
  describe('the default export', () => {
    subject(mySagaWrapper())

    it('takes every `startClock`', () => {
      expect($subject.next().value)
        .to.eql(call(takeEvery, 'startClock', startIt))
    })
  })

  // THIS right here
  describe('startIt()', () => {
    subject(startIt())

    it('invokes a delay', () => {
      expect($subject.next().value)
        .to.eql(call(delay, 1000 / 60))
    })
  })
})

function* mySagaWrapper() {
  yield* MySaga
}

Если ваш экспортированный массив содержит несколько эффектов, например:

// file: mysaga.js
export default [
  call(takeEvery, 'startClock', startIt),
  call(takeEvery, 'foo', doFoo),
]

export function* doFoo() {
}

Просто добавьте еще один пример теста:

  describe('the default export', () => {
    subject(mySagaWrapper())

    it('takes every `startClock`', () => {
      expect($subject.next().value)
        .to.eql(call(takeEvery, 'startClock', startIt))
    })

    it('takes every `foo`', () => {
      expect($subject.next().value)
        .to.eql(call(takeEvery, 'foo', doFoo))
    })
  })

Это не то, что я бы назвал идеальным решением, так как оно включает в себя экспорт подробностей частной реализации, но оно определенно делает возможным тестирование.

...