该应用程序建立在Angular v4
上,并且直到现在为止都随着每次发行而逐渐更新。目前,我们在Angular v7
上任职,最终CEO同意编写单元测试,而以前并非如此。
我刚刚创建了一个简单的规范,以开始测试并开始在整个项目中实施它,但是由于以下错误而停滞了两天:
async()测试助手需要AsyncTestZoneSpec,但找不到> AsyncTestZoneSpec。请确保您的环境包括zone.js / dist / async-> test.js
在搜索上述错误时,我找到了一些答案,但这与Wallaybyjs
有关,但特定于Angular。
我尝试通过angular
项目的全新安装来重现该问题,但实际上并非如此。在Angular 7
上运行测试需要缺少一些依赖项,这可能是一个问题。
以下是test.ts
文件:
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
declare const __karma__: any;
declare const require: any;
// Prevent Karma from running prematurely.
__karma__.loaded = function () {};
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);
// Finally, start Karma to run the tests.
__karma__.start();
和Package.json
:
{
"name": "frontend",
"version": "0.1.2-7",
"appVersion": "2.104",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"build-staging": "bash build-staging.sh",
"build-production": "bash build-production.sh",
"compodoc": "npx compodoc -p src/tsconfig.app.json"
},
"private": true,
"dependencies": {
"@angular-devkit/build-angular": "^0.13.9",
"@angular/animations": "7.0.3",
"@angular/common": "7.0.3",
"@angular/compiler": "7.0.3",
"@angular/core": "7.0.3",
"@angular/forms": "7.0.3",
"@angular/http": "7.0.3",
"@angular/platform-browser": "7.0.3",
"@angular/platform-browser-dynamic": "7.0.3",
"@angular/router": "7.0.3",
"@fortawesome/fontawesome-free": "^5.9.0",
"@mobiscroll/angular": "^4.7.3",
"@ng-bootstrap/ng-bootstrap": "^4.2.1",
"@ngx-translate/core": "^11.0.1",
"@ngx-translate/http-loader": "^4.0.0",
"angular2-virtual-scroll": "^0.4.16",
"core-js": "^2.6.9",
"moment": "^2.22.2",
"ng-block-ui": "^2.1.5",
"ng2-charts": "^1.6.0",
"ngx-infinite-scroll": "^7.2.0",
"ngx-lazy-load-images": "^1.3.1",
"rxjs": "^6.5.2",
"rxjs-compat": "^6.5.2",
"zone.js": "^0.8.29"
},
"devDependencies": {
"@angular/cli": "7.0.5",
"@angular/compiler-cli": "^7.2.15",
"@angular/language-service": "7.0.3",
"@compodoc/compodoc": "^1.1.9",
"@types/jasmine": "^2.8.16",
"@types/jasminewd2": "~2.0.2",
"@types/node": "^10.14.10",
"codelyzer": "^4.4.2",
"jasmine-core": "~3.3.0",
"jasmine-spec-reporter": "~4.1.0",
"karma": "^4.1.0",
"karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^2.0.5",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^1.4.2",
"protractor": "^5.4.2",
"ts-node": "~7.0.1",
"tslint": "~5.7.0",
"typescript": "3.1.6"
}
}
以下是component
规范:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { InsuranceComponent } from './insurance.component';
import { CartModule } from '../../cart/cart.module';
import { SharedModule } from '../../shared/shared.module';
import { CommonModule } from '@angular/common';
import { MbscModule } from '@mobiscroll/angular';
import { FormsModule } from '@angular/forms';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { PipeModule } from '../../pipe/pipe.module';
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
import { InsuranceRoutingModule } from '../insurance-routing/insurance-routing.module';
import { InsuranceSearchItemComponent } from '../insurance-search-item/insurance-search-item.component';
// tslint:disable-next-line:max-line-length
import { InsuranceSearchItemDetailsComponent } from '../insurance-search-item/insurance-search-item-details/insurance-search-item-details.component';
describe('Insurance Component', () => {
let component: InsuranceComponent;
let fixture: ComponentFixture<InsuranceComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
CartModule,
SharedModule,
CommonModule,
MbscModule,
FormsModule,
NgbModule,
PipeModule,
InfiniteScrollModule,
InsuranceRoutingModule
],
declarations: [InsuranceComponent, InsuranceSearchItemComponent, InsuranceSearchItemDetailsComponent]
}).compileComponents();
fixture = TestBed.createComponent(InsuranceComponent);
component = fixture.componentInstance;
fixture.detectChanges();
}));
it('should create', () => {
expect(component).toBeTruthy();
});
});
任何帮助将不胜感激。 谢谢
答案 0 :(得分:7)
升级Angular 11后出现此错误。
此行必须是test.ts中的第一行,之前是所有其他导入项:
import 'zone.js/dist/zone-testing'; // zone-testing needs to be first import!
答案 1 :(得分:1)
我使用这个命令是为了测试一个文件:
ng test --include somecomponent.spec.ts
正如@clean-code 所述,您将遇到 --main
选项的问题。
答案 2 :(得分:1)
我在使用旁观者测试框架时遇到了同样的问题。
解决方案是,在观众导入之前导入 jest-preset-angular。
错误:
import { defineGlobalsInjections } from '@ngneat/spectator';
import 'jest-preset-angular';
正确:
import 'jest-preset-angular';
import { defineGlobalsInjections } from '@ngneat/spectator';
答案 3 :(得分:0)
要使用async()功能,您需要导入区域测试。 尝试将区域测试包导入到您的test.ts文件中。
import 'zone.js/dist/zone-testing'
答案 4 :(得分:0)
该命令可能已被弃用:
ng test --main somecomponent.spec.ts
但是
ng test
要仅运行特定的spec
,而要运行all
,只需在describe
和it
块前加上f
fdescribe('whatever', () => {})