babel-jest ES2015 导入语句
babel-jest ES2015 import statements
有人用 es2015 语法编写 jasmine / jest 测试吗?它需要多少 shimming / polyfill / gerrymandering?
我在正确导入函数时遇到问题。我有一个模块:
..../utils/TweetUtils.js
'use strict';
export function getListOfTweetIds (tweets) {
return Object.keys(tweets);
};
和一个测试套件:
..../__tests__/TweetUtils-test.js
'use strict';
jest.dontMock('../TweetUtils');
import * as TweetUtils from '../TweetUtils';
describe('Tweet utilities module', () => {
it('has access to the TweetUtils methods', () => {
let testObj = {a:'a',b:'b',c:'c'};
// Passes
expect(TweetUtils.getListOfTweetIds).toBeDefined();
// Passes
expect(typeof TweetUtils.getListOfTweetIds).toBe('function');
// Fails
expect(TweetUtils.getListOfTweetIds(testObj)).toBeTruthy();
});
});
如果我用这样的东西将控制台输出黑进套件:expect(‘’).toBe(TweetUtils);
Jasmine 报告:
- Expected: '' toBe: {
default: {
getListOfTweetIds: Function
},
getListOfTweetIds: Function
}
所以看起来import语句在做一些事情,但它显然不是老老实实地导入我的方法。使用命名函数语法导入时得到相同的结果:import {getListOfTweetIds} from ‘../TweetUtils’;
但是如果我使用默认语法:import getListOfTweetIds from ‘../TweetUtils’;
第二个规范失败了 - 它不再是 typeof function
,而是 typeof object // => {default: Function}
我一直在梳理文档和未解决的问题。几个月以来一直有相关问题,但已知问题似乎不对。我已经尝试导入我的 jest.dontMock 语句以避免提升,大约:https://github.com/babel/babel-jest/issues/16 但没有骰子。
如果我修改 TweetUtils.js 以使用 module.exports = function…
并使用 const myFunction = require(‘../TweetUtils’)
将其引入套件,一切正常,但它不会感觉我正在引导真正的 ES2015 魔法。当生态系统赶上新语法时,每个人现在是否都在处理不稳定的变通办法?
如您所说,import
语句被提升,这会导致 jest 自动模拟功能出现问题(模块是在 之前 导入的,您告诉 jest 取消模拟它).
TweetUtils.getListOfTweetIds
已正确导入但被模拟,因此每个调用 return undefined
。这就是第三个期望失败的原因。
导入 jest.dontMock
语句可以工作(我测试过)但对我来说听起来很脏(你真的想为每个测试模块创建一个 "dontmock module" 文件吗?)
您必须对测试模块使用 require
语法。替换
import * as TweetUtils from '../TweetUtils';
来自
const TweetUtils = require('../TweetUtils');
在我修复它之前,在玩笑的例子中是一样的:jest#379
问题似乎出在 babel 而不是 jest 。试试这个解决方案。
If you are using 'create-react-app' then install these dev dependencies:
"babel-cli": "^6.26.0",
"babel-jest": "^22.4.1",
"babel-preset-react-app": "^3.1.1",
同时更新 .babelrc
(如果不存在则创建此文件):
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
现在 jest 和 npm test 都可以正常工作了。
有人用 es2015 语法编写 jasmine / jest 测试吗?它需要多少 shimming / polyfill / gerrymandering?
我在正确导入函数时遇到问题。我有一个模块: ..../utils/TweetUtils.js
'use strict';
export function getListOfTweetIds (tweets) {
return Object.keys(tweets);
};
和一个测试套件:
..../__tests__/TweetUtils-test.js
'use strict';
jest.dontMock('../TweetUtils');
import * as TweetUtils from '../TweetUtils';
describe('Tweet utilities module', () => {
it('has access to the TweetUtils methods', () => {
let testObj = {a:'a',b:'b',c:'c'};
// Passes
expect(TweetUtils.getListOfTweetIds).toBeDefined();
// Passes
expect(typeof TweetUtils.getListOfTweetIds).toBe('function');
// Fails
expect(TweetUtils.getListOfTweetIds(testObj)).toBeTruthy();
});
});
如果我用这样的东西将控制台输出黑进套件:expect(‘’).toBe(TweetUtils);
Jasmine 报告:
- Expected: '' toBe: {
default: {
getListOfTweetIds: Function
},
getListOfTweetIds: Function
}
所以看起来import语句在做一些事情,但它显然不是老老实实地导入我的方法。使用命名函数语法导入时得到相同的结果:import {getListOfTweetIds} from ‘../TweetUtils’;
但是如果我使用默认语法:import getListOfTweetIds from ‘../TweetUtils’;
第二个规范失败了 - 它不再是 typeof function
,而是 typeof object // => {default: Function}
我一直在梳理文档和未解决的问题。几个月以来一直有相关问题,但已知问题似乎不对。我已经尝试导入我的 jest.dontMock 语句以避免提升,大约:https://github.com/babel/babel-jest/issues/16 但没有骰子。
如果我修改 TweetUtils.js 以使用 module.exports = function…
并使用 const myFunction = require(‘../TweetUtils’)
将其引入套件,一切正常,但它不会感觉我正在引导真正的 ES2015 魔法。当生态系统赶上新语法时,每个人现在是否都在处理不稳定的变通办法?
如您所说,import
语句被提升,这会导致 jest 自动模拟功能出现问题(模块是在 之前 导入的,您告诉 jest 取消模拟它).
TweetUtils.getListOfTweetIds
已正确导入但被模拟,因此每个调用 return undefined
。这就是第三个期望失败的原因。
导入 jest.dontMock
语句可以工作(我测试过)但对我来说听起来很脏(你真的想为每个测试模块创建一个 "dontmock module" 文件吗?)
您必须对测试模块使用 require
语法。替换
import * as TweetUtils from '../TweetUtils';
来自
const TweetUtils = require('../TweetUtils');
在我修复它之前,在玩笑的例子中是一样的:jest#379
问题似乎出在 babel 而不是 jest 。试试这个解决方案。
If you are using 'create-react-app' then install these dev dependencies:
"babel-cli": "^6.26.0",
"babel-jest": "^22.4.1",
"babel-preset-react-app": "^3.1.1",
同时更新 .babelrc
(如果不存在则创建此文件):
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
现在 jest 和 npm test 都可以正常工作了。