从 0 到 100%的覆盖率非常快
从 0 到 100%的覆盖率非常快
原文:https://medium.com/hackernoon/from-0-to-100-coverage-real-quick-d71dda7069e5

Jest — A JS testing framework used by Facebook
我的体验单元测试首映
我最近发布了关于 Premiere 的文章,这是一个 Javascript 库,我发布它是为了方便使用 RESTful APIs,我的目标之一是使这个库可靠,达到 100%的测试覆盖率,或者至少接近这个水平。
要这样做,我的第一个选择是选择如何去做;于是我开始阅读流行的摩卡/柴/西农+伊斯坦布尔进行测试覆盖。虽然我设置了基本的测试环境和脚本,但我的经历非常痛苦;使用 Typescript 使得测试更加困难。
如果你习惯了 Karma,Jasmine,Mocha/Chai/Sinon 并且和他们在一起很开心,那也不错。这篇文章是关于我到目前为止对这些技术的体验。
在经历了大量的忙乱、花费的时间和导入的包之后,测试watcher和coverage仍然不能为我工作。为了做简单的测试,我不得不从许多库中导入我的代码,有些来自chai,有些来自sinon,有些来自sinon-chai,这看起来非常困难和混乱;此外,我正在处理打字稿,需要所有的打字工作。到最后,我非常沮丧,这一切都偏离了我的主要关注点,那就是写测试,而不是做配置。
在做一些研究时,我发现了 Jest,一个由脸书创建和使用的测试框架。起初我以为它是为 React 项目设计的,但是通过查看 Jest 主页,我开始注意到它是多么强大和容易安装。更好的是,有一个不错的软件包可以轻松处理打字稿。
设置 Jest 像微风一样容易,它有一个很好的观察者,测试覆盖面开箱即用。整个流程感觉非常流畅,一切就绪使它变得容易多了,文档齐全的 api 也非常有用。
一旦一切就绪,接下来的事情就是仔细检查每个功能,确保所有功能都被覆盖,以获得期望的 100%❤。基本功能、describe、it和expect在大多数情况下已经足够,剩下的由对Promise的支持来完成。为了帮助隔离每个测试,用jest.fn()创建模拟也很有帮助。
让我们看一些代码,所以这听起来不像是脸书的免费营销。以下代码写在类型脚本中,引用 Premiere 的缓存类。
首先,让我们导入主类。我遵循的模式是将.spec.ts放在与“原始”文件相同的文件夹中。
**import** Cache **from** './Cache';
现在让我们设置我们的describe块,并为我们的测试准备一些变量,这样我们的生活会更轻松。注意,我们使用的是类型为any的变量,所以除了缓存之外,我们不需要导入更多的东西,目的是让我们的spec更加独立。
describe('Cache', () => {
**let** cache: Cache;
**let** model: **any**;
**let** list: **any**[];
**let** promise: **any** = 'promise instance';
现在,在每次测试之前,我们将初始化我们的变量。
beforeEach(() => {
cache = **new** Cache(**null**);
model = {key: jest.fn().mockReturnValue('id')};
list = [model];
});
为了掌握它是如何工作的,让我们来看几个测试。
it('should set api on construct', () => {
cache = **new** Cache('api' as **any**);
expect(cache.api).toBe('api');
});it('should resolve key from object', () => {
expect(Cache.*resolveKey*(model)).toBe('id');
});it('should set list', () => {
cache.setList('list', list);
expect(cache.lists['list']).toBe(list);
});
如果您希望查看整个文件,请参考https://github . com/pedsmoreira/premiere/blob/master/lib/premiere/cache . spec . ts
配置
Jest 配置非常简单。只是把这些部分添加到了 package.json 中。
脚本:
“test”: “jest — coverage — no-cache ${1}”,
“test-watch”: “jest ${1} — watch”,
开发依赖项:
"@types/jest": "^16.0.2",
"jest": "^18.0.0",
"ts-jest": "^18.0.0",
最后是“jest”块。
这一部分是必要的,因为项目使用 Typescript。不要害怕,这主要是样板文件,被 ts-jest 很好地记录了下来。
"jest": {
"moduleFileExtensions": [
"ts",
"js"
],
"transform": {
"\\.(ts)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
},
"testRegex": "lib/.*\\.spec.(ts|js)$",
"testResultsProcessor": "<rootDir>/node_modules/ts-jest/coverageprocessor.js",
"globals": {
"__TS_CONFIG__": {
"target": "es6",
"module": "commonjs",
"moduleResolution": "node"
}
}
}
完整的 package.json 可从https://github . com/pedsmoreira/premiere/blob/master/package . JSON获得
所以,如果你有机会,不管有没有,试一试笑话,你可能会给自己带来惊喜。感觉事情“刚刚好”的感觉非常好\o/
希望你喜欢:)



