对需要 Electron 的 Angular2 服务进行单元测试
Unit testing an Angular2 service that requires Electron
我正在使用 Angular2 (rc4) 和 Webpack 开发 Electron 应用程序。单元测试 运行 with Karma.
我有一个与电子进程通信的服务,它以这种方式包含它:
import { remote } from 'electron';
@Injectable()
export class SettingsService {
main = remote.require('./main.js');
settings: any;
constructor() {
this.settings = this.main.getSettings();
}
}
当我想为这个文件编写单元测试时,karma 运行ner 抛出这个错误:
Error: Cannot find module "electron"
at webpack:///src/app/services/settings.service.ts:9:0 <- spec-bundle.js:88524
如果我将目标:'electron-renderer' 添加到 webpack.test.js 配置文件,错误将更改为:
ReferenceError: Can't find variable: require
at webpack:/external%20%22electron%22:1:0 <- spec-bundle.js:83860
这是我的 webpack.test.js 文件:
const helpers = require('./helpers');
module.exports = {
devtool: 'inline-source-map',
resolve: {
extensions: ['', '.ts', '.js']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'ts'
},
{
test: /\.html$/,
loader: 'html'
},
{
test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
loader: 'null'
},
{
test: /\.css$/,
loader: 'null'
}
],
postLoaders: [
{
test: /\.(js|ts)$/, loader: 'istanbul-instrumenter-loader',
include: helpers.root('src'),
exclude: [
/\.(e2e|spec)\.ts$/,
/node_modules/
]
}
]
},
target:'electron-renderer'
}
问题是:如何 运行 对与 Electron 进程通信的 Angular2 组件进行单元测试。
解决方案是使用 karma-electron。
应该更改 karma.conf.js 以使用 electron 作为浏览器:
var webpackConfig = require('./webpack.test');
module.exports = function (config) {
var _config = {
basePath: '',
frameworks: ['jasmine'],
files: [{ pattern: './spec-bundle.js', watched: false }],
preprocessors: { './spec-bundle.js': ['electron', 'coverage', 'webpack', 'sourcemap'] },
webpack: webpackConfig,
coverageReporter: {
dir: '../coverage/',
reporters: [
{
type: 'text-summary',
type: 'json',
type: 'html',
}
]
},
webpackMiddleware: {
stats: 'errors-only'
},
webpackServer: {
noInfo: true
},
reporters: ['spec', 'coverage'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: ['Electron'],
singleRun: true,
client: {
useIframe: false
}
};
config.set(_config);
};
但是,这仍然会引发错误:
Uncaught ReferenceError: exports is not defined
at <appath>/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:32
这已在 jasmine-core 中解决,但尚未在 jasmine-npm 中解决(参见:https://github.com/jasmine/jasmine/issues/1144
在发布新的 npm 版本的 jasmine-core 之前,解决方法是使用直接 github link 而不是 package.json 中的 npm 包版本:
"devDependencies": {
....
"jasmine-core": "https://github.com/jasmine/jasmine.git",
....
}
我正在使用 Angular2 (rc4) 和 Webpack 开发 Electron 应用程序。单元测试 运行 with Karma.
我有一个与电子进程通信的服务,它以这种方式包含它:
import { remote } from 'electron';
@Injectable()
export class SettingsService {
main = remote.require('./main.js');
settings: any;
constructor() {
this.settings = this.main.getSettings();
}
}
当我想为这个文件编写单元测试时,karma 运行ner 抛出这个错误:
Error: Cannot find module "electron"
at webpack:///src/app/services/settings.service.ts:9:0 <- spec-bundle.js:88524
如果我将目标:'electron-renderer' 添加到 webpack.test.js 配置文件,错误将更改为:
ReferenceError: Can't find variable: require
at webpack:/external%20%22electron%22:1:0 <- spec-bundle.js:83860
这是我的 webpack.test.js 文件:
const helpers = require('./helpers');
module.exports = {
devtool: 'inline-source-map',
resolve: {
extensions: ['', '.ts', '.js']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'ts'
},
{
test: /\.html$/,
loader: 'html'
},
{
test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
loader: 'null'
},
{
test: /\.css$/,
loader: 'null'
}
],
postLoaders: [
{
test: /\.(js|ts)$/, loader: 'istanbul-instrumenter-loader',
include: helpers.root('src'),
exclude: [
/\.(e2e|spec)\.ts$/,
/node_modules/
]
}
]
},
target:'electron-renderer'
}
问题是:如何 运行 对与 Electron 进程通信的 Angular2 组件进行单元测试。
解决方案是使用 karma-electron。
应该更改 karma.conf.js 以使用 electron 作为浏览器:
var webpackConfig = require('./webpack.test');
module.exports = function (config) {
var _config = {
basePath: '',
frameworks: ['jasmine'],
files: [{ pattern: './spec-bundle.js', watched: false }],
preprocessors: { './spec-bundle.js': ['electron', 'coverage', 'webpack', 'sourcemap'] },
webpack: webpackConfig,
coverageReporter: {
dir: '../coverage/',
reporters: [
{
type: 'text-summary',
type: 'json',
type: 'html',
}
]
},
webpackMiddleware: {
stats: 'errors-only'
},
webpackServer: {
noInfo: true
},
reporters: ['spec', 'coverage'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: ['Electron'],
singleRun: true,
client: {
useIframe: false
}
};
config.set(_config);
};
但是,这仍然会引发错误:
Uncaught ReferenceError: exports is not defined
at <appath>/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:32
这已在 jasmine-core 中解决,但尚未在 jasmine-npm 中解决(参见:https://github.com/jasmine/jasmine/issues/1144
在发布新的 npm 版本的 jasmine-core 之前,解决方法是使用直接 github link 而不是 package.json 中的 npm 包版本:
"devDependencies": {
....
"jasmine-core": "https://github.com/jasmine/jasmine.git",
....
}