karma 在 ng 测试后看不到测试(执行 0 次,共 0 次成功)
karma doesn't see tests after ng test (Executed 0 of 0 SUCCESS)
我在 运行ning 测试中遇到了问题。 运行ning ng test
命令后,命令行显示
Chrome 83.0.4103 (Windows 7.0.0): Executed 0 of 0 SUCCESS (0.007 secs / 0 secs)
TOTAL: 0 SUCCESS
TOTAL: 0 SUCCESS
在我的浏览器中,我看到带有信息的业力标签:
0 specs, 0 failures
在控制台中出现错误
Failed to load resource: the server responded with a status of 404 (Not Found)
在其他笔记本电脑上测试 运行。
我的karma.conf.js
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
files: [
'src/app/**/*.js'
],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../coverage'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
});
};
Package.json
{
"name": "angular-i-spy",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"api": "json-server server/db.json --watch"
},
"private": true,
"dependencies": {
"@angular-devkit/build-angular": "^0.900.3",
"@angular/animations": "^9.0.2",
"@angular/common": "^9.0.2",
"@angular/compiler": "^9.0.2",
"@angular/core": "^9.0.2",
"@angular/forms": "^9.0.2",
"@angular/http": "^7.2.16",
"@angular/localize": "^9.1.9",
"@angular/platform-browser": "^9.0.2",
"@angular/platform-browser-dynamic": "^9.0.2",
"@angular/router": "^9.0.2",
"@ng-bootstrap/ng-bootstrap": "^5.3.0",
"bootstrap": "^4.4.1",
"core-js": "^2.6.11",
"json-server": "^0.16.1",
"rxjs": "~6.5.4",
"ts-md5": "^1.2.7",
"zone.js": "~0.10.2"
},
"devDependencies": {
"@angular/cli": "^9.0.3",
"@angular/compiler-cli": "^9.0.2",
"@angular/language-service": "^9.0.2",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "^2.0.8",
"@types/node": "~8.9.4",
"codelyzer": "~4.3.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "^4.4.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "^2.0.6",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "^5.4.3",
"ts-node": "~7.0.0",
"tslint": "~5.11.0",
"typescript": "^3.7.5"
}
}
测试示例:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { InitialPageComponent } from './initial-page.component';
describe('InitialPageComponent', () => {
let component: InitialPageComponent;
let fixture: ComponentFixture<InitialPageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ InitialPageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(InitialPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
Test.ts
import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
declare const require: any;
// 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);
tsconfig.spec.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"test.ts",
"polyfills.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
}
angular.json
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"angular-iSpy": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/angular-iSpy",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "angular-iSpy:build"
},
"configurations": {
"production": {
"browserTarget": "angular-iSpy:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "angular-iSpy:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "src/karma.conf.js",
"styles": [
"src/styles.css"
],
"scripts": [],
"assets": [
"src/favicon.ico",
"src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"angular-iSpy-e2e": {
"root": "e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "angular-iSpy:serve"
},
"configurations": {
"production": {
"devServerTarget": "angular-iSpy:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyBeaconManagement": {
"root": "projects/ISpyBeaconManagement/",
"sourceRoot": "projects/ISpyBeaconManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyBeaconManagement",
"index": "projects/ISpyBeaconManagement/src/index.html",
"main": "projects/ISpyBeaconManagement/src/main.ts",
"polyfills": "projects/ISpyBeaconManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyBeaconManagement/tsconfig.app.json",
"assets": [
"projects/ISpyBeaconManagement/src/favicon.ico",
"projects/ISpyBeaconManagement/src/assets"
],
"styles": [
"projects/ISpyBeaconManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyBeaconManagement/src/environments/environment.ts",
"with": "projects/ISpyBeaconManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyBeaconManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyBeaconManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyBeaconManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyBeaconManagement/src/test.ts",
"polyfills": "projects/ISpyBeaconManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyBeaconManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyBeaconManagement/karma.conf.js",
"styles": [
"projects/ISpyBeaconManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyBeaconManagement/src/favicon.ico",
"projects/ISpyBeaconManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyBeaconManagement/tsconfig.app.json",
"projects/ISpyBeaconManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyBeaconManagement-e2e": {
"root": "projects/ISpyBeaconManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyBeaconManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyBeaconManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyBeaconManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyBeaconManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyRoomManagement": {
"root": "projects/ISpyRoomManagement/",
"sourceRoot": "projects/ISpyRoomManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyRoomManagement",
"index": "projects/ISpyRoomManagement/src/index.html",
"main": "projects/ISpyRoomManagement/src/main.ts",
"polyfills": "projects/ISpyRoomManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyRoomManagement/tsconfig.app.json",
"assets": [
"projects/ISpyRoomManagement/src/favicon.ico",
"projects/ISpyRoomManagement/src/assets"
],
"styles": [
"projects/ISpyRoomManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyRoomManagement/src/environments/environment.ts",
"with": "projects/ISpyRoomManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyRoomManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyRoomManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyRoomManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyRoomManagement/src/test.ts",
"polyfills": "projects/ISpyRoomManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyRoomManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyRoomManagement/karma.conf.js",
"styles": [
"projects/ISpyRoomManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyRoomManagement/src/favicon.ico",
"projects/ISpyRoomManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyRoomManagement/tsconfig.app.json",
"projects/ISpyRoomManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyRoomManagement-e2e": {
"root": "projects/ISpyRoomManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyRoomManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyRoomManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyRoomManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyRoomManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyLocationManagement": {
"root": "projects/ISpyLocationManagement/",
"sourceRoot": "projects/ISpyLocationManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyLocationManagement",
"index": "projects/ISpyLocationManagement/src/index.html",
"main": "projects/ISpyLocationManagement/src/main.ts",
"polyfills": "projects/ISpyLocationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyLocationManagement/tsconfig.app.json",
"assets": [
"projects/ISpyLocationManagement/src/favicon.ico",
"projects/ISpyLocationManagement/src/assets"
],
"styles": [
"projects/ISpyLocationManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyLocationManagement/src/environments/environment.ts",
"with": "projects/ISpyLocationManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyLocationManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyLocationManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyLocationManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyLocationManagement/src/test.ts",
"polyfills": "projects/ISpyLocationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyLocationManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyLocationManagement/karma.conf.js",
"styles": [
"projects/ISpyLocationManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyLocationManagement/src/favicon.ico",
"projects/ISpyLocationManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyLocationManagement/tsconfig.app.json",
"projects/ISpyLocationManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyLocationManagement-e2e": {
"root": "projects/ISpyLocationManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyLocationManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyLocationManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyLocationManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyLocationManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyPresentationManagement": {
"root": "projects/ISpyPresentationManagement/",
"sourceRoot": "projects/ISpyPresentationManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyPresentationManagement",
"index": "projects/ISpyPresentationManagement/src/index.html",
"main": "projects/ISpyPresentationManagement/src/main.ts",
"polyfills": "projects/ISpyPresentationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyPresentationManagement/tsconfig.app.json",
"assets": [
"projects/ISpyPresentationManagement/src/favicon.ico",
"projects/ISpyPresentationManagement/src/assets"
],
"styles": [
"projects/ISpyPresentationManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyPresentationManagement/src/environments/environment.ts",
"with": "projects/ISpyPresentationManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyPresentationManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyPresentationManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyPresentationManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyPresentationManagement/src/test.ts",
"polyfills": "projects/ISpyPresentationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyPresentationManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyPresentationManagement/karma.conf.js",
"styles": [
"projects/ISpyPresentationManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyPresentationManagement/src/favicon.ico",
"projects/ISpyPresentationManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyPresentationManagement/tsconfig.app.json",
"projects/ISpyPresentationManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyPresentationManagement-e2e": {
"root": "projects/ISpyPresentationManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyPresentationManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyPresentationManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyPresentationManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyPresentationManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"defaultProject": "angular-iSpy"
}
我在命令行中也遇到错误
ERROR in node_modules/@types/node/index.d.ts:73:11 - error TS2300: Duplicate identifier 'IteratorResult'.
73 interface IteratorResult<T> { }
~~~~~~~~~~~~~~
node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6
41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
~~~~~~~~~~~~~~
'IteratorResult' was also declared here.
node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6 - error TS2300: Duplicate identifier 'IteratorResult'.
41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
~~~~~~~~~~~~~~
node_modules/@types/node/index.d.ts:73:11
73 interface IteratorResult<T> { }
~~~~~~~~~~~~~~
'IteratorResult' was also declared here.
非常感谢您的帮助。
Run npm i @types/node@latest --save-dev
此命令将解决您遇到的错误。
要解决 0 规格问题,请执行以下操作:-
从您的 karma.conf.js 中删除文件数组,它应该是 fine.test.ts 将负责执行所有测试用例。
如果仍然无效,请将您的 tsconfig.spec.json 更改为:-
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"src/test.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}
在 angular.json 中,你应该有类似的东西:-
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css"
],
"scripts": []
}
}
我遇到了同样的问题,但是在 angular/nativescript 共享代码项目中。我通过从 karma.conf.js 中删除文件配置并添加 tsconfig.spec.json:
解决了这个问题
"compilerOptions": {
"paths": {
"@src/*": [
"src/*.ts"
]
},
"types": [
"jasmine",
"node"
]
},
我在 运行ning 测试中遇到了问题。 运行ning ng test
命令后,命令行显示
Chrome 83.0.4103 (Windows 7.0.0): Executed 0 of 0 SUCCESS (0.007 secs / 0 secs)
TOTAL: 0 SUCCESS
TOTAL: 0 SUCCESS
在我的浏览器中,我看到带有信息的业力标签:
0 specs, 0 failures
在控制台中出现错误
Failed to load resource: the server responded with a status of 404 (Not Found)
在其他笔记本电脑上测试 运行。
我的karma.conf.js
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
files: [
'src/app/**/*.js'
],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../coverage'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
});
};
Package.json
{
"name": "angular-i-spy",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"api": "json-server server/db.json --watch"
},
"private": true,
"dependencies": {
"@angular-devkit/build-angular": "^0.900.3",
"@angular/animations": "^9.0.2",
"@angular/common": "^9.0.2",
"@angular/compiler": "^9.0.2",
"@angular/core": "^9.0.2",
"@angular/forms": "^9.0.2",
"@angular/http": "^7.2.16",
"@angular/localize": "^9.1.9",
"@angular/platform-browser": "^9.0.2",
"@angular/platform-browser-dynamic": "^9.0.2",
"@angular/router": "^9.0.2",
"@ng-bootstrap/ng-bootstrap": "^5.3.0",
"bootstrap": "^4.4.1",
"core-js": "^2.6.11",
"json-server": "^0.16.1",
"rxjs": "~6.5.4",
"ts-md5": "^1.2.7",
"zone.js": "~0.10.2"
},
"devDependencies": {
"@angular/cli": "^9.0.3",
"@angular/compiler-cli": "^9.0.2",
"@angular/language-service": "^9.0.2",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "^2.0.8",
"@types/node": "~8.9.4",
"codelyzer": "~4.3.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "^4.4.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "^2.0.6",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "^5.4.3",
"ts-node": "~7.0.0",
"tslint": "~5.11.0",
"typescript": "^3.7.5"
}
}
测试示例:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { InitialPageComponent } from './initial-page.component';
describe('InitialPageComponent', () => {
let component: InitialPageComponent;
let fixture: ComponentFixture<InitialPageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ InitialPageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(InitialPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
Test.ts
import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
declare const require: any;
// 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);
tsconfig.spec.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"test.ts",
"polyfills.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
}
angular.json
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"angular-iSpy": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/angular-iSpy",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "angular-iSpy:build"
},
"configurations": {
"production": {
"browserTarget": "angular-iSpy:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "angular-iSpy:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "src/karma.conf.js",
"styles": [
"src/styles.css"
],
"scripts": [],
"assets": [
"src/favicon.ico",
"src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"angular-iSpy-e2e": {
"root": "e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "angular-iSpy:serve"
},
"configurations": {
"production": {
"devServerTarget": "angular-iSpy:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyBeaconManagement": {
"root": "projects/ISpyBeaconManagement/",
"sourceRoot": "projects/ISpyBeaconManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyBeaconManagement",
"index": "projects/ISpyBeaconManagement/src/index.html",
"main": "projects/ISpyBeaconManagement/src/main.ts",
"polyfills": "projects/ISpyBeaconManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyBeaconManagement/tsconfig.app.json",
"assets": [
"projects/ISpyBeaconManagement/src/favicon.ico",
"projects/ISpyBeaconManagement/src/assets"
],
"styles": [
"projects/ISpyBeaconManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyBeaconManagement/src/environments/environment.ts",
"with": "projects/ISpyBeaconManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyBeaconManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyBeaconManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyBeaconManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyBeaconManagement/src/test.ts",
"polyfills": "projects/ISpyBeaconManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyBeaconManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyBeaconManagement/karma.conf.js",
"styles": [
"projects/ISpyBeaconManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyBeaconManagement/src/favicon.ico",
"projects/ISpyBeaconManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyBeaconManagement/tsconfig.app.json",
"projects/ISpyBeaconManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyBeaconManagement-e2e": {
"root": "projects/ISpyBeaconManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyBeaconManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyBeaconManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyBeaconManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyBeaconManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyRoomManagement": {
"root": "projects/ISpyRoomManagement/",
"sourceRoot": "projects/ISpyRoomManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyRoomManagement",
"index": "projects/ISpyRoomManagement/src/index.html",
"main": "projects/ISpyRoomManagement/src/main.ts",
"polyfills": "projects/ISpyRoomManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyRoomManagement/tsconfig.app.json",
"assets": [
"projects/ISpyRoomManagement/src/favicon.ico",
"projects/ISpyRoomManagement/src/assets"
],
"styles": [
"projects/ISpyRoomManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyRoomManagement/src/environments/environment.ts",
"with": "projects/ISpyRoomManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyRoomManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyRoomManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyRoomManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyRoomManagement/src/test.ts",
"polyfills": "projects/ISpyRoomManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyRoomManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyRoomManagement/karma.conf.js",
"styles": [
"projects/ISpyRoomManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyRoomManagement/src/favicon.ico",
"projects/ISpyRoomManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyRoomManagement/tsconfig.app.json",
"projects/ISpyRoomManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyRoomManagement-e2e": {
"root": "projects/ISpyRoomManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyRoomManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyRoomManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyRoomManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyRoomManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyLocationManagement": {
"root": "projects/ISpyLocationManagement/",
"sourceRoot": "projects/ISpyLocationManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyLocationManagement",
"index": "projects/ISpyLocationManagement/src/index.html",
"main": "projects/ISpyLocationManagement/src/main.ts",
"polyfills": "projects/ISpyLocationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyLocationManagement/tsconfig.app.json",
"assets": [
"projects/ISpyLocationManagement/src/favicon.ico",
"projects/ISpyLocationManagement/src/assets"
],
"styles": [
"projects/ISpyLocationManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyLocationManagement/src/environments/environment.ts",
"with": "projects/ISpyLocationManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyLocationManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyLocationManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyLocationManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyLocationManagement/src/test.ts",
"polyfills": "projects/ISpyLocationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyLocationManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyLocationManagement/karma.conf.js",
"styles": [
"projects/ISpyLocationManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyLocationManagement/src/favicon.ico",
"projects/ISpyLocationManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyLocationManagement/tsconfig.app.json",
"projects/ISpyLocationManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyLocationManagement-e2e": {
"root": "projects/ISpyLocationManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyLocationManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyLocationManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyLocationManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyLocationManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyPresentationManagement": {
"root": "projects/ISpyPresentationManagement/",
"sourceRoot": "projects/ISpyPresentationManagement/src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ISpyPresentationManagement",
"index": "projects/ISpyPresentationManagement/src/index.html",
"main": "projects/ISpyPresentationManagement/src/main.ts",
"polyfills": "projects/ISpyPresentationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyPresentationManagement/tsconfig.app.json",
"assets": [
"projects/ISpyPresentationManagement/src/favicon.ico",
"projects/ISpyPresentationManagement/src/assets"
],
"styles": [
"projects/ISpyPresentationManagement/src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ISpyPresentationManagement/src/environments/environment.ts",
"with": "projects/ISpyPresentationManagement/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ISpyPresentationManagement:build"
},
"configurations": {
"production": {
"browserTarget": "ISpyPresentationManagement:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ISpyPresentationManagement:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ISpyPresentationManagement/src/test.ts",
"polyfills": "projects/ISpyPresentationManagement/src/polyfills.ts",
"tsConfig": "projects/ISpyPresentationManagement/tsconfig.spec.json",
"karmaConfig": "projects/ISpyPresentationManagement/karma.conf.js",
"styles": [
"projects/ISpyPresentationManagement/src/styles.css"
],
"scripts": [],
"assets": [
"projects/ISpyPresentationManagement/src/favicon.ico",
"projects/ISpyPresentationManagement/src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"projects/ISpyPresentationManagement/tsconfig.app.json",
"projects/ISpyPresentationManagement/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ISpyPresentationManagement-e2e": {
"root": "projects/ISpyPresentationManagement-e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "projects/ISpyPresentationManagement-e2e/protractor.conf.js",
"devServerTarget": "ISpyPresentationManagement:serve"
},
"configurations": {
"production": {
"devServerTarget": "ISpyPresentationManagement:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "projects/ISpyPresentationManagement-e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"defaultProject": "angular-iSpy"
}
我在命令行中也遇到错误
ERROR in node_modules/@types/node/index.d.ts:73:11 - error TS2300: Duplicate identifier 'IteratorResult'.
73 interface IteratorResult<T> { }
~~~~~~~~~~~~~~
node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6
41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
~~~~~~~~~~~~~~
'IteratorResult' was also declared here.
node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6 - error TS2300: Duplicate identifier 'IteratorResult'.
41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
~~~~~~~~~~~~~~
node_modules/@types/node/index.d.ts:73:11
73 interface IteratorResult<T> { }
~~~~~~~~~~~~~~
'IteratorResult' was also declared here.
非常感谢您的帮助。
Run npm i @types/node@latest --save-dev
此命令将解决您遇到的错误。
要解决 0 规格问题,请执行以下操作:- 从您的 karma.conf.js 中删除文件数组,它应该是 fine.test.ts 将负责执行所有测试用例。
如果仍然无效,请将您的 tsconfig.spec.json 更改为:-
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"src/test.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}
在 angular.json 中,你应该有类似的东西:-
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css"
],
"scripts": []
}
}
我遇到了同样的问题,但是在 angular/nativescript 共享代码项目中。我通过从 karma.conf.js 中删除文件配置并添加 tsconfig.spec.json:
解决了这个问题"compilerOptions": {
"paths": {
"@src/*": [
"src/*.ts"
]
},
"types": [
"jasmine",
"node"
]
},