如何模拟导入的数组并测试使用函数

How to mock an imported array and test the using Function

我正在导出数组:

//constants.js
export const myarray = ['apples', 'oranges', 'pears'];

//checkFunction.js
import myarray from ./constants

function check(value) {
    return myarray.includes(value);
}

我希望能够在我的测试套件中模拟数组,以便我可以针对不同的测试控制它的值。 我的问题是,使用 Mocha & Sinon,我如何测试函数 check() 并模拟导入的数组 myarray。 如果我为 check() 创建一个存根,我如何让它使用模拟的 myarray?

sinon.stub(checkFunction, 'checkFunction')

你正在测试 check 函数,你不应该存根它。就像你说的,你应该在测试用例中模拟 myarray 。您可以在 checkFunction.js 模块的 require/import 之前改变 myarray 的值。确保在 运行 每个测试用例之前清除模块缓存,以便后续导入 constants 模块会给你一个新鲜的 myarray,而不是变异的。

例如

constants.js:

export const myarray = ['apples', 'oranges', 'pears'];

checkFunction.js:

import { myarray } from './constants';

export function check(value) {
  console.log('myarray: ', myarray);
  return myarray.includes(value);
}

checkFunction.test.js:

import { expect } from 'chai';

describe('72411318', () => {
  beforeEach(() => {
    delete require.cache[require.resolve('./checkFunction')];
    delete require.cache[require.resolve('./constants')];
  });
  it('should pass', () => {
    const { myarray } = require('./constants');
    myarray.splice(0, myarray.length);
    myarray.push('beef', 'lobster');
    const { check } = require('./checkFunction');
    expect(check('apples')).to.be.false;
  });

  it('should pass 2', () => {
    const { check } = require('./checkFunction');
    expect(check('apples')).to.be.true;
  });
});

测试结果:

  72411318
myarray:  [ 'beef', 'lobster' ]
    ✓ should pass (194ms)
myarray:  [ 'apples', 'oranges', 'pears' ]
    ✓ should pass 2


  2 passing (204ms)