如何测试可导出一系列效果的传奇?

时间:2018-10-03 22:51:34

标签: redux-saga

我所看到的所有关于传奇测试的示例都涉及测试函数生成器,但是我花了一点时间来尝试测试导出一系列redux效果的文件。这是我正在使用的基本内容:

// 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
}

运行测试时,得到的结果如下:

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 :(得分:0)

关键基本上是直接测试函数生成器(以下为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))
    })
  })

这不是我认为理想的解决方案,因为它涉及导出私有实现的详细信息,但是绝对可以进行测试。