Redux Saga:投掷并停止发电机

时间:2019-10-11 10:57:13

标签: unit-testing redux redux-saga riteway

我在写发电机。我正在用RITEway进行测试。它检查是否定义了window.ethereum。如果不是,它应该抛出并停止。基本上,它应该满足以下测试:

describe('handle initialize Web3 saga', async assert => {
  global.window = {}

  assert({
    given: 'nothing, the window object',
    should: 'have no property called Web3',
    actual: window.web3,
    expected: undefined
  })

  const gen = cloneableGenerator(handleInitializeWeb3)()

  {
    // The important parts are in this block scope
    const clone = gen.clone()

    assert({
      given: 'window.ethereum undefined',
      should: 'throw',
      actual: clone.next().value.message,
      expected: '[WARNING]: window.ethereum has no provider!'
    })

    assert({
      given: 'nothing',
      should: 'be done',
      actual: clone.next().done,
      expected: true
    })
  }

  class Provider {}

  window.ethereum = new Provider()

  // ... more tests
})

这是我尝试实施的方式。

function* handleInitializeWeb3() {
  if (!window.ethereum) {
    yield new Error('[WARNING]: window.ethereum has no provider!')
  }
  // ... more yields
}

但是这个传奇并没有停止。 should: 'be done'失败的测试,并且该传奇从yield语句之外的if s返回值。抛出错误后,我如何才能通过这些测试并且使传奇停止?

1 个答案:

答案 0 :(得分:1)

yield处理错误实例的行为与产生任何其他值的行为相同(即,生成器保持运行)。如果要停止生成器,则应像正常功能一样throw new Error(...

如果由于某种原因您不想throw且实际上确实想产生一个错误实例然后停止,则在return;错误之后只需yield