我正在从一个使用 的文件中模拟一个函数moment,这是文件内容:
./utils/dateUtils:
import moment from 'moment-timezone'
export function getToday() {
return moment().tz(commonTimeZone)
}
Run Code Online (Sandbox Code Playgroud)
./containers/someContainer.js:
import { getToday } from 'utils/dateUtils'
// Uses getToday in the component
Run Code Online (Sandbox Code Playgroud)
./containers/someContainer.spec.js:
import moment from 'moment-timezone'
jest.mock('utils/dateUtils', () => {
return {
getToday : moment(new Date('2018-01-01'))
}
})
Run Code Online (Sandbox Code Playgroud)
测试抛出此错误:
? Test suite failed to run
/Users/bharat/Documents/redmart-repo/partner-portalv2/app/containers/Orders/PickupsContainer.test.js: babel-plugin-jest-hoist: The module factory of `jest.mock()` is not allowed to reference any out-of-scope variables.
Invalid variable access: moment
Whitelisted objects: Array, ArrayBuffer, Boolean, DataView, Date, Error, EvalError, Float32Array, Float64Array, Function, Generator, GeneratorFunction, Infinity, Int16Array, Int32Array, Int8Array, InternalError, Intl, JSON, Map, Math, NaN, Number, Object, Promise, Proxy, RangeError, ReferenceError, Reflect, RegExp, Set, String, Symbol, SyntaxError, TypeError, URIError, Uint16Array, Uint32Array, Uint8Array, Uint8ClampedArray, WeakMap, WeakSet, arguments, expect, jest, require, undefined, DTRACE_NET_SERVER_CONNECTION, DTRACE_NET_STREAM_END, DTRACE_HTTP_SERVER_REQUEST, DTRACE_HTTP_SERVER_RESPONSE, DTRACE_HTTP_CLIENT_REQUEST, DTRACE_HTTP_CLIENT_RESPONSE, global, process, Buffer, clearImmediate, clearInterval, clearTimeout, setImmediate, setInterval, setTimeout, console.
Note: This is a precaution to guard against uninitialized mock variables. If it is ensured that the mock is required lazily, variable names prefixed with `mock` are permitted.
at invariant (node_modules/babel-plugin-jest-hoist/build/index.js:12:11)
at newFn (node_modules/babel-traverse/lib/visitors.js:276:21)
at NodePath._call (node_modules/babel-traverse/lib/path/context.js:76:18)
at NodePath.call (node_modules/babel-traverse/lib/path/context.js:48:17)
at NodePath.visit (node_modules/babel-traverse/lib/path/context.js:105:12)
at TraversalContext.visitQueue (node_modules/babel-traverse/lib/context.js:150:16)
at TraversalContext.visitMultiple (node_modules/babel-traverse/lib/context.js:103:17)
Run Code Online (Sandbox Code Playgroud)
不确定这里缺少什么,有人知道如何解决此错误。
PS我试过,jest.doMock但它没有嘲笑任何东西。
你的问题是jest.mock调用被提升,这意味着它们被放在文件的最顶部。在文档中找到它有点棘手,但他们在jest.doMock.
这使您执行的代码看起来像这样:
jest.mock('utils/dateUtils', () => {
return {
getToday : moment(new Date('2018-01-01'))
}
})
import moment from 'moment-timezone'
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它moment是在导入之前使用的,因此是关于引用范围外变量的错误消息。
有多种方法可以避免这种情况。
但使用jest.doMock时应避免吊装。我想知道路径是否缺少诸如 – 请'../utils...注意初始../–
还有一个事实是,您将getToday的模拟定义为一个值而不是一个函数,这可能会使您的测试在实际模拟模块时失败。
无论如何,有两种主要的方法来模拟模块
这个想法是首先模拟导入,然后定义模拟的实现。
import moment from 'moment-timezone'
import * as dateUtils from 'utils/dateUtils'
jest.mock('utils/dateUtils')
dateUtils.getToday = () => moment(new Date('2018-01-01'))
Run Code Online (Sandbox Code Playgroud)
在这里,您使用模块的模拟实现创建一个模拟文件,该文件将在您模拟模块的任何地方导入。该模拟文件必须位于一个__mocks__文件夹中,该文件夹需要与您要模拟的文件处于同一级别。例如:
??? utils
? ??? __mocks__
? ? ??? dateUtils.js
? ??? dateUtils.js
?
??? other folders
Run Code Online (Sandbox Code Playgroud)
代码如下所示:
??? utils
? ??? __mocks__
? ? ??? dateUtils.js
? ??? dateUtils.js
?
??? other folders
Run Code Online (Sandbox Code Playgroud)
和测试:
// utils/__mocks__/dateUtils.js
import moment from 'moment-timezone'
export const getToday = () => moment(new Date('2018-01-01'))
Run Code Online (Sandbox Code Playgroud)
您需要在模拟中本地调用包,这是为了确保不使用外部变量 -
jest.mock('utils/dateUtils', () => {
const moment = require("moment-timezone");
return {
getToday : moment(new Date('2018-01-01'))
}
})
Run Code Online (Sandbox Code Playgroud)
这是相关问题的链接 - https://github.com/facebook/jest/issues/2567。
| 归档时间: |
|
| 查看次数: |
8634 次 |
| 最近记录: |