我有一些传奇故事,他们使用效果来按模式执行动作。现在,我正在尝试对其进行测试:
传奇:
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
)
);
});
在接受模式中,我有一个匿名函数,那么如何测试接受模式是否等于我在测试中提供的模式?
现在的测试结果是:
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,则不能确定模式是否相等。
答案 0 :(得分:0)
Jest可以帮助您确定效果层的顺序。在单元测试中,您要测试一段代码(即传奇,函数等)而不是执行链的流程。因此,将为您尝试测试的模式提供[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()
})
})
})
通常,如果要测试模式,请使用单独的测试仅测试该特定功能。并在给定不同参数的情况下断言其输出。