reactjs - 如何为回调 API 编写 JEST 测试用例
问题描述
我创建了一个 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();
}));
解决方案
userLogin
动作创建者(thunk)不接受回调,也不做请求。不知道是否store.dispatch
返回一个可以等待的承诺。
单元测试的正确策略是模拟除测试单元之外的所有内容。由于serviceFactory
正在使用抽象,因此不应涉及 Axios。Action creator 也可以在不涉及 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);
测试可以通过这种方式保持同步。
推荐阅读
- javascript - 在 Vue.JS 中显示 Axios 响应数据
- javascript - 在 2 个不同的 div 中显示动态 JSON 数据
- reactjs - 在 React-Native 中,我有一个问题列表,我需要每页呈现 2 个问题。实现它的最佳方法是什么?
- python - 在 pygame 中,重置每个精灵位置的最有效方法是什么?
- javascript - 如何使用 jQuery 为空字段设置警报?
- c# - 如何为运行时语言更改资源 xml 文件?
- google-bigquery - 如何从 Bigquery 表中提取空值作为 TableRow 对象
- ubuntu-18.04 - CKAN 2.8 上的 DataPusher 生产部署 - OperationalError: (sqlite3.OperationalError) 尝试写入只读数据库
- r - 在 data.table 中的列上,以单个“data.table”方式记录来自函数的“by = ...”-分层和非分层输出
- bash - 如何解释这个'sort -k1,1n -k2,2n -k3,3n'命令