我正在测试一个带有玩笑的角度项目(使用jest-preset-angular)。
在收集报道时,我得到一个未覆盖的分支,我不明白为什么。我可以用 3 个文件重现这个问题。
some-dependency.ts
export class SomeDependency {}
Run Code Online (Sandbox Code Playgroud)
some-service.ts
import { Injectable } from '@angular/core';
import { SomeDependency } from './some-dependency';
@Injectable()
export class SomeService {
constructor(private dependency: SomeDependency) {
console.log('service created');
}
}
Run Code Online (Sandbox Code Playgroud)
some-service.spec
import { SomeService } from './some-service';
describe('DerivedClass', () => {
it('should create', () => {
expect(new SomeService(null)).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
通过运行yarn jest --coverage some-service,我得到以下报道:
--------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line …Run Code Online (Sandbox Code Playgroud) 使用 Angular 8、@angular-builders/jest 8.0.2、jest 24.8,并给出以下测试通过
import { tick, fakeAsync } from '@angular/core/testing';
it('test 1000 milliseconds', fakeAsync(() => {
const fn = jest.fn();
setTimeout(() => {
fn();
}, 1000);
tick(999);
expect(fn).not.toHaveBeenCalled();
tick(1);
expect(fn).toHaveBeenCalled();
}));
Run Code Online (Sandbox Code Playgroud)
我想使用编写几个类似的测试it.each
it.each([[1000], [2000], [3000]])(
'test %d milliseconds',
fakeAsync(milliseconds => {
const fn = jest.fn();
setTimeout(() => {
fn();
}, milliseconds);
tick(milliseconds - 1);
expect(fn).not.toHaveBeenCalled();
tick(1);
expect(fn).toHaveBeenCalled();
}),
);
Run Code Online (Sandbox Code Playgroud)
但我在每次测试中都遇到这个错误:
Expected to be running in 'ProxyZone', but it was not found.
at Function.Object.<anonymous>.ProxyZoneSpec.assertPresent (node_modules/zone.js/dist/proxy.js:42:19)
at node_modules/zone.js/dist/fake-async-test.js:588:47
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
我使用它是@angular-builders/jest为了在测试角度项目时用玩笑替换业力。我喜欢有 2 个库为 jest:jest-extended和获取额外的匹配器@testing-library/jest-dom。
我找不到自动导入匹配器的方法,这样我就不必在每个规范文件中导入它们。
重现问题的最小示例jest-extended
首先,创建一个 Angular 项目并安装 jest 依赖项
ng new --defaults my-project
cd my-project
yarn add -D jest @types/jest @angular-builders/jest jest-extended
Run Code Online (Sandbox Code Playgroud)
然后编辑angular.json以替换构建器
...
"test": {
"builder": "@angular-builders/jest:run"
},
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以使用 jest 和命令运行并通过测试
...
"test": {
"builder": "@angular-builders/jest:run"
},
Run Code Online (Sandbox Code Playgroud)
现在,我使用一个笑话扩展匹配器添加一个测试。在app.component.spec.ts:
...
it('should work with jest-extended matchers', () => {
expect([1, 1, 1]).toBeArrayOfSize(3);
});
Run Code Online (Sandbox Code Playgroud)
尝试#1
创造jest.config.js
ng test
Run Code Online (Sandbox Code Playgroud)
不起作用,我收到错误TS2339: Property 'toBeArrayOfSize' does not exist on type 'ArrayLikeMatchers<number>' …