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

我开始认为这是不可能的,但是无论如何我都想问。

我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易-

应用程式码:

// myModule.js

import dependency from './dependency';

export default (x) => {

dependency.doSomething(x * 2);

}

和测试代码:

//myModule-test.js

import 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.js

export default (x) => {

const dependency = require('./dependency'); // yuck

dependency.doSomething(x * 2);

}

//myModule-test.js

describe('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中也有可能。

回答:

我已经能够通过使用涉及到的hack来解决此问题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

});

});

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

以上是 如何使用Jest模拟ES6模块导入? 的全部内容, 来源链接: utcz.com/qa/432399.html

回到顶部