Jest中的module.export单元测试问题

时间:2020-02-22 07:01:06

标签: javascript unit-testing jestjs

我在页面上有两个函数,它们包含很多jQuery。代码在下面

 module.exports = function(property) {
    var data = decodeEntities(property)
}

function decodeEntities(encodedString) {
     let textArea = document.createElement('textarea');
     textArea.innerHTML = encodedString;
     return textArea.value;
}

我需要为encodeEntities函数编写测试用例。但是我不敢更改module.exports = function(property)此代码,因为它是从handlebars模板调用的。

现在如何在不导出的情况下测试decodeEntities函数的单元测试?

1 个答案:

答案 0 :(得分:0)

您可以使用rewire模块来获取未导出的decodeEntities函数。例如

index.js

module.exports = function(property) {
  var data = decodeEntities(property);
};

function decodeEntities(encodedString) {
  let textArea = document.createElement('textarea');
  textArea.innerHTML = encodedString;
  return textArea.value;
}

index.test.js

const rewire = require('rewire');
const mod = rewire('./');

describe('60349818', () => {
  describe('#decodeEntities', () => {
    it('should pass', () => {
      const mElement = { innerHTML: '', value: 'some value' };
      const mCreateElement = jest.fn().mockReturnValueOnce(mElement);
      mod.__set__('document', {
        createElement: mCreateElement,
      });
      const decodeEntities = mod.__get__('decodeEntities');
      const actual = decodeEntities('encodedString');
      expect(actual).toEqual('some value');
      expect(mCreateElement).toBeCalledWith('textarea');
    });
  });
});

单元测试结果:

 PASS  stackoverflow/60349818/index.test.js
  60349818
    #decodeEntities
      ✓ should pass (4ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.334s

源代码:https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60349818