javascript - 抛出错误 [object Object]
问题描述
我遇到了这个问题,并且已经发现了这个问题,但是作为其他用户的文档,我发布了我在这里找到的内容。另请注意,经验丰富的 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()
才能进入生成器函数,但没有一个提到你需要在调用之前调用它的原因.throw(error)
是你需要将你的函数迭代到try
块中。测试的行为与应有的完全一样,您在 a 之外引发了异常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
块内。
因为这个启示的功劳——对我来说是一个启示——是由于其他人,这里是帮助我解决这个问题的评论的链接。github问题评论
推荐阅读
- python - random.seed AttributeError:模块“随机”没有属性“randrange”
- python - 如何集成 2 个 keras 模型输出?
- dictionary - 在地图中插入对
- python - beautifulsoup 得到一个 AttributeError:'NoneType' 对象没有来自 div 子文本的属性 'text'
- python - 具有softmax似然的多类分类
- php - 关系中的空值属于laravel?
- python-3.x - Python解释器与IDLE内存分配
- c# - 如何转换一些 unicode-bidi?
- react-admin - 复合键支持
- python - Python 3 线性化规则