我在写发电机。我正在用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返回值。抛出错误后,我如何才能通过这些测试并且使传奇停止?
答案 0 :(得分:1)
yield
处理错误实例的行为与产生任何其他值的行为相同(即,生成器保持运行)。如果要停止生成器,则应像正常功能一样throw new Error(...
。
如果由于某种原因您不想throw
且实际上确实想产生一个错误实例然后停止,则在return;
错误之后只需yield