@cic-digital/jest-testscript-util

npm install --save @cic-digital/jest-testscript-util

Usage no npm install needed!

<script type="module">
  import cicDigitalJestTestscriptUtil from 'https://cdn.skypack.dev/@cic-digital/jest-testscript-util';
</script>

README

jest测试脚本util

方便编写jest测试脚本的几个函数

install

npm install --save @cic-digital/jest-testscript-util

用法

这里的example可以在example目录下找到

假设我们有一个子程序 sub.js

function subfunc(param1, param2) {
  return param1 + param2;
}
module.exports.subfunc = subfunc;

和一个主程序main.js

const { subfunc } = require('./sub');

function mainfunc(param1, param2) {
  const addresult = subfunc(param1, param2);
  return param1 + addresult;
}

module.exports.mainfunc = mainfunc;

测试数据main.data.js

module.exports.maintestdata = [
  {
    description: '测试用例1',
    // 定义被测函数传入参数
    input: [
      1,
      2,
    ],
    // 定义被测函数输出
    output: {
      isError: false,
      returnvalue: 4,
    },
    // 定义被mock函数状态
    submock: {
      // 被mock的函数预计是否会被调用
      isCalled: true,
      // 被mock的函数被调用时的参数
      expectParam: [
        1,
        2,
      ],
      // 定义被mock函数的mock实现
      mockasfunc: () => 3,
    }
  },
  {
    description: '测试用例2 异常',
    input: [
      1,
      2,
    ],
    output: {
      isError: true,
      returnvalue: 4,
    },
    submock: {
      isCalled: true,
      expectParam: [
        1,
        2,
      ],
      mockasfunc: () => { 
        throw new Error('error');
      },
    }
  },
];

测试脚本

/* eslint-env jest */

// 引入测试util
const { TestUtil } = require('../index');

// 引入测试数据
const {
  maintestdata,
} = require('./main.data');

// 引入被测方法
const {
  mainfunc,
} = require('./testmodule/main');

// 引入需要mock的方法
const { subfunc } = require('./testmodule/sub');
// 用jest进行mock
jest.mock('./testmodule/sub');

describe('测试', () => {
  describe.each(maintestdata)(
    'mainfunc测试',
    (testdata) => {
      beforeEach(() => {
        subfunc.mockImplementation(testdata.submock.mockasfunc);
      });

      test(testdata.description, async () => {
        const testuitl = new TestUtil(testdata.description);
        let normalcase = false;
        let result;
        try {
          result = mainfunc(...testdata.input);
          normalcase = true;
        } catch (error) {
          testuitl.commonErrorCheck(error, testdata.output);
        }
        testuitl.commonReturnValueCheck(normalcase, result, testdata.output);
        testuitl.commonMockFunCheck(subfunc, testdata.submock);
      });
    },
  );
});

利用supertest来做route的测试时,可以使用标准结果验证函数commonRouteTest来验证状态码和返回值

const response = await request(testdata.routemodule).post(testdata.routeinfo.url).send(testdata.routeinfo.data);
testuitl.commonRouteTest(response, testdata);

// testdata需要包含
// expect: {
//   statusCode: 200,
//   response下text data 需要定义其中一个
//   response: {
//     text: 'response string',
//     data: { responsedata: 'aaa' },
//   },
// },