gpt4 book ai didi

jestjs - Redux runSaga(单元测试)错误引发局部变量未定义。如何使用 Jest 或 Sinon 模拟局部变量?

转载 作者:行者123 更新时间:2023-12-01 16:46:28 24 4
gpt4 key购买 nike

在我的 redux saga 生成器函数上运行 runSaga,我的窗口变量被抛出为未定义,但我的测试文件正在通过,有什么方法可以模拟窗口变量吗?

下面是我的 redux saga 生成器函数

import api from 'my-api';

const getSuburb = () => window.userCookies.selectedSuburb;

function* saga(payload) {
const action = yield take('REQUEST_LIBRARY');
const selectedSuburb = yield call(getSuburb);
const getStateLibraries = yield call(api.getLibraries, selectedSuburb, action.userId);
yield put(loadLibrary(getStateLibraries)
}

在运行上面的代码时,我收到了有关郊区的图书馆列表,我有另一个状态保存郊区信息,我可以使用 select 来检索它。代码运行良好

使用 RunSaga 测试 redux saga 的单元测试用例

const recordSaga = async function (sagaHandler, initalAction) {
const dispatchedActions = [];
const fakeStore = {
getState: () => (initialState),
dispatch: action => dispatchedActions.push(action),
};
await runSaga(
fakeStore,
sagaHandler,
initalAction,
).done;
return dispatchedActions;
};

describe('Run Saga', () => {
it('should dispatch action libraries', async() => {
const dispatched = await recordSaga(saga, { user_id:2 });
expect(dispatched).toContainEqual(loadLibrarySuccess(someProfile));
}

运行上面的代码时,我的 selectedSuburb 为未定义,因为 window.userCookies.totalSuburbs 未定义,是否有更好的方法来模拟 getSuburb 函数?

最佳答案

我建议看看 Redux-Saga 文档是如何建议的 sagas testing 。在单元测试中,仅应测试函数 saga 的逻辑,而不应测试对任何第三方函数的调用。 yield 关键字对此有很大帮助。

本质上,我们测试生成器函数(本例中的函数 saga)将在每次调用时返回正确的对象。因此 saga 函数的单元测试看起来像(未经测试,只是示例)

describe('Run Saga', () => {
it('should dispatch action libraries', () => {
const gen = saga() // As saga is generator function it will return generator object
expect(gen.next().value).toStrictEqual(take('REQUEST_LIBRARY'))
expect(gen.next({ userId: 'user1' } /* here can be action returned by take('REQUEST_LIBRARY') in saga */).value).toStrictEqual(call(getSuburb))
expect(gen.next({ suburb: 'central suburb' } /* here can be selectedSuburb returned by call(getSuburb) in saga */).value).toStrictEqual(call(api.getLibraries, { suburb: 'central suburb' }, 'user1'))
// The values of selectedSuburb and action.userId are from calls to gen.next()
expect(gen.next({ libraries: ['lib 1', 'lib 2'] } }).value).toStrictEqual(put(loadLibrary({ libraries: ['lib 1', 'lib 2'] }))
expect(gen.next().done).toBe(true); // Saga is finished
}
})

因此单元测试仅检查 saga 本身,不会调用 saga 在执行时调用的任何函数。所以在使用 sagas 时你根本不需要模拟任何东西。这证实了单元测试的思想,即仅单独测试单个代码单元(函数)。

正如您可能注意到的,从 yield 返回的值应该传递给 next() 函数,但在行。这就是生成器的工作原理。

关于jestjs - Redux runSaga(单元测试)错误引发局部变量未定义。如何使用 Jest 或 Sinon 模拟局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58635532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com