如何为回调API编写JEST测试用例

时间:2018-12-28 09:47:00

标签: reactjs jestjs babel-jest jest-fetch-mock

我创建了一个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();
}));

enter image description here enter image description here

1 个答案:

答案 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);

测试可以通过这种方式保持同步。