为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Jest模拟ES6模块导入?

如何使用Jest模拟ES6模块导入?

慕的地6264312 2019-12-09 10:16:46
我开始认为这是不可能的,但是无论如何我都想问。我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易-应用程式码:// myModule.jsimport dependency from './dependency';export default (x) => {  dependency.doSomething(x * 2);}和测试代码://myModule-test.jsimport myModule from '../myModule';import dependency from '../dependency';describe('myModule', () => {  it('calls the dependency with double the input', () => {    spyOn(dependency, 'doSomething');    myModule(2);    expect(dependency.doSomething).toHaveBeenCalledWith(4);  });});笑话相当于什么?我觉得这很简单,但是我一直想弄清楚我的头发。我最接近的方法是将imports 替换为requires,然后将它们移入测试/函数中。都不是我想做的事情。// myModule.jsexport default (x) => {  const dependency = require('./dependency'); // yuck  dependency.doSomething(x * 2);}//myModule-test.jsdescribe('myModule', () => {  it('calls the dependency with double the input', () => {    jest.mock('../dependency');    myModule(2);    const dependency = require('../dependency'); // also yuck    expect(dependency.doSomething).toBeCalledWith(4);  });});为了获得加分,我希望在其中的功能dependency.js为默认导出时使整个工作正常进行。但是,我知道监视默认导出在Jasmine中不起作用(或者至少我永远无法使它起作用),因此我也不希望在Jest中也有可能。
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我已经能够通过使用涉及到的黑客解决此问题import *。它甚至适用于命名和默认导出!


对于命名出口:


// dependency.js

export const doSomething = (y) => console.log(y)


// myModule.js

import { doSomething } from './dependency';


export default (x) => {

  doSomething(x * 2);

}


// myModule-test.js

import myModule from '../myModule';

import * as dependency from '../dependency';


describe('myModule', () => {

  it('calls the dependency with double the input', () => {

    dependency.doSomething = jest.fn(); // Mutate the named export


    myModule(2);


    expect(dependency.doSomething).toBeCalledWith(4);

  });

});

或默认导出:


// dependency.js

export default (y) => console.log(y)


// myModule.js

import dependency from './dependency'; // Note lack of curlies


export default (x) => {

  dependency(x * 2);

}


// myModule-test.js

import myModule from '../myModule';

import * as dependency from '../dependency';


describe('myModule', () => {

  it('calls the dependency with double the input', () => {

    dependency.default = jest.fn(); // Mutate the default export


    myModule(2);


    expect(dependency.default).toBeCalledWith(4); // Assert against the default

  });

});

正如Mihai Damian在下面正确指出的那样,这是对的模块对象进行了变异dependency,因此它将“泄漏”到其他测试中。因此,如果使用这种方法,则应存储原始值,然后在每次测试后再次将其重新设置。要使用Jest轻松实现此目的,请使用spyOn()方法代替,jest.fn()因为它支持轻松恢复其原始值,因此避免了前面提到的“泄漏”。


查看完整回答
反对 回复 2019-12-09
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您必须模拟模块并自己设置间谍:


import myModule from '../myModule';

import dependency from '../dependency';

jest.mock('../dependency', () => ({

  doSomething: jest.fn()

}))


describe('myModule', () => {

  it('calls the dependency with double the input', () => {

    myModule(2);

    expect(dependency.doSomething).toBeCalledWith(4);

  });

});


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 1263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信