如何通过 Jest 测试带有模式功能的 redux-saga?
How to test redux-saga take with pattern function by Jest?
我有一些 saga 使用 take effect 按模式获取动作。现在,我正在尝试对其进行测试:
传奇:
export function* mySaga(spaceId) {
while (true) {
const action = yield take(
action =>
action.type === MEDIA_SESSION_RESPONSE &&
action.payload.data.category === ScreenShareData &&
action.payload.data.topicId === spaceId
);
const remoteScreenSessionId = action.payload.data.content.sessionId;
yield put(addRemoteScreenSessionId(remoteScreenSessionId));
}
}
测试:
it('test', () => {
const gen = sagas.mySaga('space_1');
expect(gen.next().value).toEqual(
take(
action =>
action.type === MEDIA_SESSION_RESPONSE &&
action.payload.data.category === ScreenShareData &&
action.payload.data.topicId === spaceId
)
);
});
在 take 模式中我有一个匿名函数,所以我如何测试 take 中的模式等于我在测试中提供的模式?
现在的测试结果是:
Expected value to equal:
{"@@redux-saga/IO": true, "combinator": false, "payload": {"pattern": [Function anonymous]}, "type": "TAKE"}
Received:
{"@@redux-saga/IO": true, "combinator": false, "payload": {"pattern": [Function anonymous]}, "type": "TAKE"}
如果我将使用 JSON.stringify,我无法确定模式是否相等。
Jest 可以帮助您断言效果层的顺序。在单元测试中,您想要测试一段代码(即 saga、函数等)而不是执行链的流程。因此,您要测试的模式是 [Function anonymous]
.
有一个名为 k-redux-saga-tester 的小库可以为您提供对模式断言的灵活性。填写 VALUE
并为 MEDIA_SESSION_RESPONSE
、ScreenShareData
、spaceId
创建必要的模拟。它应该看起来像这样:
describe('mySaga', () => {
describe('search', () => {
const test = tester(mySaga) <--- your saga
const spaceId = 'VALUE';
const MEDIA_SESSION_RESPONSE = 'VALUE';
const ScreenShareData = 'VALUE';
const payload = { data: { category: VALUE, topicId: VALUE }};
const action = { type: 'YOUR_ACTION_TYPE', payload: { payload }};
it('should search and set something', () => {
const mocks = {
take: [action =>
action.type === MEDIA_SESSION_RESPONSE &&
action.payload.data.category === ScreenShareData &&
action.payload.data.topicId === spaceId]
}
expect(test(mocks)).toMatchSnapshot()
})
})
})
一般来说,如果您想测试该模式,请使用单独的测试来仅测试该特定功能。并在给定不同参数的情况下断言输出。
我有一些 saga 使用 take effect 按模式获取动作。现在,我正在尝试对其进行测试:
传奇:
export function* mySaga(spaceId) {
while (true) {
const action = yield take(
action =>
action.type === MEDIA_SESSION_RESPONSE &&
action.payload.data.category === ScreenShareData &&
action.payload.data.topicId === spaceId
);
const remoteScreenSessionId = action.payload.data.content.sessionId;
yield put(addRemoteScreenSessionId(remoteScreenSessionId));
}
}
测试:
it('test', () => {
const gen = sagas.mySaga('space_1');
expect(gen.next().value).toEqual(
take(
action =>
action.type === MEDIA_SESSION_RESPONSE &&
action.payload.data.category === ScreenShareData &&
action.payload.data.topicId === spaceId
)
);
});
在 take 模式中我有一个匿名函数,所以我如何测试 take 中的模式等于我在测试中提供的模式?
现在的测试结果是:
Expected value to equal:
{"@@redux-saga/IO": true, "combinator": false, "payload": {"pattern": [Function anonymous]}, "type": "TAKE"}
Received:
{"@@redux-saga/IO": true, "combinator": false, "payload": {"pattern": [Function anonymous]}, "type": "TAKE"}
如果我将使用 JSON.stringify,我无法确定模式是否相等。
Jest 可以帮助您断言效果层的顺序。在单元测试中,您想要测试一段代码(即 saga、函数等)而不是执行链的流程。因此,您要测试的模式是 [Function anonymous]
.
有一个名为 k-redux-saga-tester 的小库可以为您提供对模式断言的灵活性。填写 VALUE
并为 MEDIA_SESSION_RESPONSE
、ScreenShareData
、spaceId
创建必要的模拟。它应该看起来像这样:
describe('mySaga', () => {
describe('search', () => {
const test = tester(mySaga) <--- your saga
const spaceId = 'VALUE';
const MEDIA_SESSION_RESPONSE = 'VALUE';
const ScreenShareData = 'VALUE';
const payload = { data: { category: VALUE, topicId: VALUE }};
const action = { type: 'YOUR_ACTION_TYPE', payload: { payload }};
it('should search and set something', () => {
const mocks = {
take: [action =>
action.type === MEDIA_SESSION_RESPONSE &&
action.payload.data.category === ScreenShareData &&
action.payload.data.topicId === spaceId]
}
expect(test(mocks)).toMatchSnapshot()
})
})
})
一般来说,如果您想测试该模式,请使用单独的测试来仅测试该特定功能。并在给定不同参数的情况下断言输出。