我创建了一个API服务工厂,它动态传递URL,并将其作为参数。一旦成功,数据就会进入回调函数,并按预期工作。同样,我将编写JEST测试用例。 我无法通过正确的方法做到这一点。可以帮助某人。非常感谢。
代码在这里
function userLogin(username, password) {
const reqBody = {
companyEmailAddress: username,
password,
};
const url = `${config.apiBaseUrl}${serviceMethodConstants.login}`;
return (dispatch) => {
dispatch(serviceFactory.postData(url, false, reqBody, function (response, dispatch) {
if (response !== undefined) {
console.log(response )
}
}));
};
}
同样,我编写了JEST测试用例,但未按预期显示任何错误或成功消息。
JEST测试代码
import { userConstants } from './constants';
import { serviceFactory } from '../../services/_helpers/serviceFactory';
const loginData = {
companyEmailAddress: 'rameshffdfdf.lambanihghgh@gmail.com',
password: 'Ramesh@1',
};
axiosMock.onPost(routeUrl).reply(200, JSON.stringify(loginData));
const spy = jest.spyOn(axios, 'post');
await store.dispatch(userActions.userLogin(...loginData, function (response, dispatch) {
expect(response.message).toEqual('Failure');
expect(spy).toBeCalled();
}));
答案 0 :(得分:1)
userLogin
动作创建者(一个笨拙的东西)不接受回调,也不做请求。未知store.dispatch
是否返回可以等待的承诺。
单元测试的正确策略是模拟除测试单元外的所有内容。由于使用了serviceFactory
抽象,因此不应该涉及Axios。动作创建者也可以在不涉及Redux的情况下进行测试。
const dispatch = jest.fn();
const postDataResult = {};
jest.spyOn(serviceFactory, 'postData').mockReturnValue(postDataResult);
userActions.userLogin('user', 'pass')(dispatch);
expect(serviceFactory.postData).toBeCalledWith(url, false, {...}, expect.any(Function));
expect(dispatch).toBeCalledWith(postDataResult);
测试可以通过这种方式保持同步。