我怎样才能在 React axios 的这个函数中做一个玩笑测试?

How can I do a jest test in this function in React axios?

伙计们,我在 React 中创建了一个服务,我需要测试这部分服务,我正在使用 axios 和 Jest 来执行此操作。 我在 React 中有下一个代码:

import axios from 'axios';
import Endpoints from './endpoints';
const baseUrl = Endpoints.getBackendEndpoint();

export const validateName =  (nameObject, callback) => {
 axios.post(`${baseUrl}/validateName`, {...nameObject})
   .then(response =>{ 
      response.data
    })
   .then(data => callback(data));
};

我不需要 return 承诺,因为所有工作都是由 callback() 函数完成的。

这是我在 Jest 中的代码:

mport moxios from 'moxios';
import * as service from '../service';
import mockResponses from './service.test.json';
import Endpoints from '../endpoints';


const validateObjName = {
    Id: 1,
    Name: 'Bob',
  }

beforeEach(() => {
const baseUrl = Endpoints.getBackendEndpoint();
  moxios.stubRequest(
    `${baseUrl}/validateName`,
    { ...validateObjName },
    {
      status: 200,
      response: mockResponses.validateForm,
    }
  );
});

afterEach(() => {
  moxios.uninstall();
});

it('validateName()', () => {
   service.validateName(validateObjName, jest.fn());
});

有效,但仍需增加 Branch 覆盖范围。

谢谢你们的帮助:D

为了获得代码覆盖率,代码必须 运行 而测试 运行ning 因此您需要 return Promise 所以你可以 await 它在你的测试中所以 then 回调 运行 在你的测试期间 .

此外,您可以将 validateName 简化为:

import axios from 'axios';
import Endpoints from './endpoints';
const baseUrl = Endpoints.getBackendEndpoint();

export const validateName = (nameObject, callback) => {
  return axios.post(`${baseUrl}/validateName`, { ...nameObject })
    .then(response => callback(response.data));
};

在您的测试中,您需要在 beforeEach 中安装 moxios 并将模拟响应作为第二个参数传递给 moxios.stubRequest

然后使用 async 测试函数和 await Promise return 编辑 validateName:

import moxios from 'moxios';
import * as service from '../service';
import mockResponses from './service.test.json';
import Endpoints from '../endpoints';

const validateObjName = {
  Id: 1,
  Name: 'Bob',
}

beforeEach(() => {
  moxios.install();  // install moxios
  const baseUrl = Endpoints.getBackendEndpoint();
  moxios.stubRequest(
    `${baseUrl}/validateName`,
    {
      status: 200,
      response: mockResponses.validateForm
    }
  );  // response is the second argument
});

afterEach(() => {
  moxios.uninstall();
});

it('validateName()', () => {
  service.validateName(validateObjName, jest.fn());
});

it('validateName()', async () => {  // use an async test function
  const spy = jest.fn();
  await service.validateName(validateObjName, spy);  // await the Promise
  expect(spy).toHaveBeenCalledWith(mockResponses.validateForm);  // Success!
});

这应该会给你一个工作测试和 100% 的代码覆盖率。