首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Jest测试函数中的函数?

用Jest测试函数中的函数?
EN

Stack Overflow用户
提问于 2019-05-01 21:10:21
回答 1查看 62关注 0票数 2

我正在使用Jest测试Redux Action Creator

这是动作创建者:

代码语言:javascript
运行
复制
const addDiscount = ({ code }) => (dispatch, getState) => {
  const { id } = getState().token;

  return dispatch({
    apiCall: discount.put({
      body: {
        code
      },
      id
    }),
    types: ADD_DISCOUNT.triplet
  });
};

这是我的测试:

代码语言:javascript
运行
复制
const apiCallMock = jest.fn();
const dispatch = jest.fn(() => {
  return {
    apiCall: apiCallMock
  };
});
const customerOrderId = 'customer-order-id';
const getState = jest.fn(() => ({
  token: {
    customerOrderId
  }
}));

const res = addDiscount({ code: 'abc123' })(dispatch, getState);

console.log(res);
console.log(dispatch.mock.calls[0][0]);
console.log(apiCallMock.mock);

如果我尝试console.log(res),结果是undefined

console.log(dispatch.mock.calls[0][0]);向我显示了类型,但apiCall是一个尚未运行的函数。

console.log(apiCallMock.mock);似乎尚未运行

EN

回答 1

Stack Overflow用户

发布于 2019-11-12 17:21:11

以下是仅使用jest的单元测试解决方案

index.ts

代码语言:javascript
运行
复制
import { discount } from './discount';

export const ADD_DISCOUNT = {
  triplet: 'triplet'
};

export const addDiscount = ({ code }) => (dispatch, getState) => {
  const { id } = getState().token;

  return dispatch({
    apiCall: discount.put({ body: { code }, id }),
    types: ADD_DISCOUNT.triplet
  });
};

discount.ts

代码语言:javascript
运行
复制
export const discount = {
  put(obj) {
    return obj;
  }
};

index.spec.ts

代码语言:javascript
运行
复制
import { addDiscount, ADD_DISCOUNT } from './';
import { discount } from './discount';

describe('addDiscount', () => {
  test('should ', () => {
    const customerOrderId = 'customer-order-id';
    const mDispatch = jest.fn();
    const mGetState = jest.fn().mockReturnValueOnce({ token: { id: customerOrderId } });
    const putSpy = jest.spyOn(discount, 'put');
    addDiscount({ code: 'abc123' })(mDispatch, mGetState);
    expect(mGetState).toBeCalledTimes(1);
    expect(mDispatch).toBeCalledWith({
      apiCall: { body: { code: 'abc123' }, id: customerOrderId },
      types: ADD_DISCOUNT.triplet
    });
    expect(putSpy).toBeCalledWith({ body: { code: 'abc123' }, id: customerOrderId });
  });
});

100%覆盖率的单元测试结果:

代码语言:javascript
运行
复制
 PASS  src/stackoverflow/55936794/index.spec.ts (9.651s)
  addDiscount
    ✓ should dispatch action correctly (7ms)

-------------|----------|----------|----------|----------|-------------------|
File         |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-------------|----------|----------|----------|----------|-------------------|
All files    |      100 |      100 |      100 |      100 |                   |
 discount.ts |      100 |      100 |      100 |      100 |                   |
 index.ts    |      100 |      100 |      100 |      100 |                   |
-------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.79s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/55936794

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55936794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档