抛出错误 [object Object]
Error [object Object] thrown
我已经 运行 解决了这个问题,并且后来发现了这个问题,但是作为其他用户的文档,我将在这里发布我发现的内容。另请注意,经验丰富的 JS 开发人员可能已经了解我的错误所在,这仅适用于像我这样的 JS 新手。
我有一个故事是这样的:
function* patchCart({ payload: { data, sections } }) {
const current = yield select(cartSelectors.getCartModel);
const oldAttributes = pick(current, keys(data));
try {
yield call(patchCartTry, data, sections);
} catch (error) {
yield call(patchCartError, error, oldAttributes);
}
}
在我的测试中,我试图测试 saga 的 catch 块。我的部分测试代码如下所示:
let current = iterator.next().value;
expect(current).toEqual(select(cartSelectors.getCartModel));
current = iterator.throw(error).value;
expect(current).toEqual(call(utilities.patchCartCatch, error, oldAttributes));
运行测试的结果给出了类似于以下的输出:
Error
[object Object] thrown
在整个互联网上寻找我找不到答案,我 运行 遇到的每个人都有这个问题,他们的错误是由于没有在他们的迭代器上调用 .next()
而造成的 - 我是已经在做了。
甚至在 catch 块中登录 saga 内部也没有触发,所以我知道测试从未真正进入那里。
敬请期待解答及后续解释
问题是,当我调用 .next()
时,我调用的次数不够。
我读过的所有资源都说你需要调用 .next()
才能进入生成器函数,但其中 none 提到你需要在调用 [=13 之前调用它的原因=] 是您需要将函数迭代到 try
块中。测试的行为完全符合预期,您在 try/catch
之外抛出了异常,因此测试抛出了错误。
因此,为了修复我的测试,我不得不将其更改为:
let current = iterator.next().value;
expect(current).toEqual(select(cartSelectors.getCartModel));
current = iterator.next().value;
expect(current).toEqual(call(utilities.patchCartTry, data, sections));
current = iterator.throw(error).value;
expect(current).toEqual(call(utilities.patchCartCatch, error, oldAttributes));
从而确保我在 try
块内,然后抛出将我带入 catch
块的异常。
因为这个启示的功劳 - 对我来说这是一个启示 - 是由于其他人,这里是 link 帮助我解决这个问题的评论。 github issue comment
我已经 运行 解决了这个问题,并且后来发现了这个问题,但是作为其他用户的文档,我将在这里发布我发现的内容。另请注意,经验丰富的 JS 开发人员可能已经了解我的错误所在,这仅适用于像我这样的 JS 新手。
我有一个故事是这样的:
function* patchCart({ payload: { data, sections } }) {
const current = yield select(cartSelectors.getCartModel);
const oldAttributes = pick(current, keys(data));
try {
yield call(patchCartTry, data, sections);
} catch (error) {
yield call(patchCartError, error, oldAttributes);
}
}
在我的测试中,我试图测试 saga 的 catch 块。我的部分测试代码如下所示:
let current = iterator.next().value;
expect(current).toEqual(select(cartSelectors.getCartModel));
current = iterator.throw(error).value;
expect(current).toEqual(call(utilities.patchCartCatch, error, oldAttributes));
运行测试的结果给出了类似于以下的输出:
Error
[object Object] thrown
在整个互联网上寻找我找不到答案,我 运行 遇到的每个人都有这个问题,他们的错误是由于没有在他们的迭代器上调用 .next()
而造成的 - 我是已经在做了。
甚至在 catch 块中登录 saga 内部也没有触发,所以我知道测试从未真正进入那里。
敬请期待解答及后续解释
问题是,当我调用 .next()
时,我调用的次数不够。
我读过的所有资源都说你需要调用 .next()
才能进入生成器函数,但其中 none 提到你需要在调用 [=13 之前调用它的原因=] 是您需要将函数迭代到 try
块中。测试的行为完全符合预期,您在 try/catch
之外抛出了异常,因此测试抛出了错误。
因此,为了修复我的测试,我不得不将其更改为:
let current = iterator.next().value;
expect(current).toEqual(select(cartSelectors.getCartModel));
current = iterator.next().value;
expect(current).toEqual(call(utilities.patchCartTry, data, sections));
current = iterator.throw(error).value;
expect(current).toEqual(call(utilities.patchCartCatch, error, oldAttributes));
从而确保我在 try
块内,然后抛出将我带入 catch
块的异常。
因为这个启示的功劳 - 对我来说这是一个启示 - 是由于其他人,这里是 link 帮助我解决这个问题的评论。 github issue comment