我尝试从redux saga测试一个传奇时遇到了以下情况。
一些包裹信息:
我使用redux-saga@0.15.6
,redux@3.7.2
与node v9.5.0
和npm 5.6.0
。
我有以下结构:
sagas
index.js
index.spec.js
在index.js
内,我定义了我的传奇。我在那里的基本想法是:
function doSomething() {
/* Some code */
}
function* notExportedSaga() {
yield takeLatest(SOME_ACTION, doSomething)
}
export function* exportedSaga(action) {
yield put({ type: OTHER_ACTION, payload: somePayload })
}
在index.spec.js
,我想测试我的传奇。我的文件顶部有一个import
:
import { exportedSaga } from './index'
使用我描述的结构和代码,这很好用。但是,如果我将doSomething
从定义更改为胖箭头函数:
const doSomething = () => {
/* Some code */
}
当运行单元测试时,会发生以下错误:
console.error node_modules/redux-saga/lib/internal/utils.js:240
uncaught at rootSaga
at rootSaga
at rootSaga
ReferenceError: doSomething is not defined
你知道为什么会这样吗?
我打开issue ,因为我不知道这是不是一个错误。
答案 0 :(得分:3)
功能声明,如
function doSomething() { }
悬挂到顶部
函数表达式,如
const doSomething = () => { }
不被悬挂
这就是您获得doSomething is not defined
的原因 - notExportedSaga
和exportedSaga
函数都被提升到顶部而表达式函数const doSomething = () => { }
不是,并且未定义你的生成器函数调用。
如果你想了解更多内容,这里有一篇关于hoisting
的精彩文章:) https://scotch.io/tutorials/understanding-hoisting-in-javascript