我和我的团队最近开始构建一个使用角-cli 1.1.1 (角4.1.3)的项目,我们正在整合angular.io的英雄之旅中的内存中-web-api,以模拟http调用,直到我们的api被构建。我能够让我们所有的业力单元测试成功地通过使用铬,但是由于CI的限制,我想试着让业力与PhantomJS一起运行。当从chrome切换到phantomJS时,有几个测试无法指定错误消息:
PhantomJS 2.1.1 (Mac OS X 0.0.0) UserDataService should be created FAILED
ReferenceError: Can't find variable: Headers in http://localhost:9876/_karma_webpack_/main.bundle.js (line 693)下面是我的user-data.service.ts文件的样子:
import {Injectable} from @angular/core";
import {Http} from "@angular/http";
import "rxjs/add/operator/map";
import "rxjs/add/operator/catch";
import "rxjs/add/operator/toPromise";
import "rxjs/add/operator/find";
import {User} from "../data-objects/user";
import {Observable} from "rxjs/Observable";
@Injectable()
export class UserDataService {
private userDataUrl = `api/userData`;
private headers = new Headers({"Content-Type": "application/json"});
constructor(private http: Http) { }
getUser(id:number): Observable<User> {
const url = `${this.userDataUrl}/?id=${id}`;
return this.http.get(url, this.headers)
.map(response => {
return response.json().data as User;
})
.catch(this.handleError);
}
private handleError(error: any): Promise<any> {
console.error("An error occurred in the user data service.", error);
return Promise.reject(error.json().error || "Server Error in UserDataServer")
}
}我已经尝试过在网络上寻找解决方案,但是到目前为止,我还没有弄清楚为什么phantomJS找不到标题,而铬可以找到。为了完整起见,这里分别是我的karma.conf.js和user-data.service.spec.ts文件。任何帮助都将不胜感激。
karma.conf.js
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular/cli'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-phantomjs-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular/cli/plugins/karma')
],
client:{
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
files: [
{ pattern: './src/test.ts', watched: false },
{ pattern: 'node_modules/angular-in-memory-web-api/**/*.js', included: false, watched: false }
],
preprocessors: {
'./src/test.ts': ['@angular/cli']
},
mime: {
'text/x-typescript': ['ts','tsx']
},
coverageIstanbulReporter: {
reports: [ 'html', 'lcovonly' ],
fixWebpackSourcePaths: true
},
angularCli: {
config: './angular-cli.json',
environment: 'dev'
},
reporters: config.angularCli && config.angularCli.codeCoverage
? ['progress', 'coverage-istanbul']
: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_DEBUG,
autoWatch: true,
// browsers: ['ChromeHeadless'],
browsers: ['PhantomJS'],
// browsers: ['Chrome'],
singleRun: false
});
};user-data.service.spec.ts
import {TestBed, inject} from '@angular/core/testing';
import {UserDataService} from './user-data.service';
import {Http, BaseRequestOptions} from "@angular/http";
import {MockBackend} from "@angular/http/testing";
describe('UserDataService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [UserDataService,
MockBackend,
BaseRequestOptions,
{provide: Http}]
});
});
fit('should be created', inject([UserDataService], (service: UserDataService) => {
expect(service).toBeTruthy();
}));
});发布于 2017-06-14 20:40:17
在查看了发生错误的main.bundle.js文件之后,我找到了这个问题的答案。使用intellij为我管理导入,我意识到头是从lib.es6.d.ts而不是从@angular/http中提取的。一旦我包含了从角导入的标头,所有在phantomJS中失败的测试都开始传递。
https://stackoverflow.com/questions/44552141
复制相似问题