Gulp + karma + jasmine + angular + singleRun:true = angular注入失败
Gulp + karma + jasmine + angular + singleRun:true = angular fails to inject
我在 运行通过 Karma 和 Gulp 进行 Jasmine 测试时遇到问题,我正在 运行通过gulp 任务进行测试
return new karma.Server({
configFile: __dirname + '\karma.conf.js',
singleRun: true
}, done).start();
我的 angular 依赖项注入失败,我收到标准 angular unknown provider myProvider
错误。当我将 singleRun
属性 更改为 false
时,大多数单元测试都通过了(尽管其中一组仍然失败)。
测试已经(并且仍然)在 Chutzpah 中运行良好。
我尝试将测试减少到准系统:
var myProvider;
beforeEach(module('MyModule'));
beforeEach(inject(function (_my_) {
myProvider = _my_;
}));
it("exists", function () {
expect(myProvider).not.toBeUndefined();
});
它仍然失败并出现 unknown provider myProvider
错误。同样,如果我将 singleRun
设置为 false
,它们 运行 没问题。我试过 运行ning PhantomJS 和 Chrome,它们都表现出完全相同的行为。
我正在使用 angular 1.4.7,我在 package.json 中的依赖项看起来像
"dependencies": {
"gulp": "^3.9.0",
"gulp-chug": "^0.4.2",
"gulp-install": "^0.6.0",
"gulp-util": "^3.0.7",
"phantomjs": "^1.9.19",
"jasmine-core": "^2.4.1",
"karma": "^0.13.19",
"karma-jasmine": "^0.3.6",
"karma-phantomjs-launcher": "^0.2.3",
"karma-spec-reporter": "^0.0.23",
"karma-chrome-launcher": "^0.2.2"
}
karma.conf.js:
module.exports = function (config) {
config.set({
frameworks: ["jasmine"],
reporters: ["spec"],
browsers: ["PhantomJS"],
files: [
"./path/to/jquery/jquery-1.11.0.min.js",
"./path/to/angular/angular.js",
"./path/to/angular/angular-route.js",
"./path/to/angular/angular-mocks.js",
// I'm using this path order (app -> modules -> all)
// due to recommendations found on SO
"./path/to/application/app.js",
"./path/to/application/**/*Module.js",
"./path/to/application/**/*.js",
// For now, I'm just running the one test to simplify debugging
"./path/to/tests/myTest.Test.js"
]
});
};
有什么想法吗?
你的 Karma conf 看起来太简单了。您需要在 karma conf 中定义预处理器。您需要预加载 Angular Javascript 文件。您还应该预加载 HTML 个文件。如果测试 HTTP,您也可能想要预加载 angular 模拟。这应该会给你一个先机。有任何具体问题请询问。
'use strict';
module.exports = function (config) {
config.set({
basePath: './',
browsers: ['PhantomJS'],
frameworks: ['jasmine'],
reporters: ['mocha', 'coverage'],
singleRun: true,
preprocessors: {
'src/**/!(*spec)*.js': ['coverage'],
'dest/**/*.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
stripPrefix: 'dest/',
moduleName: 'ngHtmlFiles'
},
coverageReporter: {
type: 'html',
dir: 'coverage'
},
files: [
'dest/vendor.min.js',
'bower_components/angular-mocks/angular-mocks.js',
'src/**/*.js',
'dest/**/*.html'
]
});
};
事实证明,我们的自定义 angular 提供程序具有内部依赖性,由于某种原因,singleRun: true
无法解决这些问题。
我在 karma.conf 中专门设置了这些文件的加载顺序,以便依赖项按 "correct" 顺序加载,现在我得到与 运行 [=11 时相同的结果=](与 singleRun:false
相同的少数测试仍然失败,但这是另一回事)。
这与 Chutzpah 一起工作的原因是那些引用(在每个单独的测试文件中列出)的顺序是正确的。
我在 运行通过 Karma 和 Gulp 进行 Jasmine 测试时遇到问题,我正在 运行通过gulp 任务进行测试
return new karma.Server({
configFile: __dirname + '\karma.conf.js',
singleRun: true
}, done).start();
我的 angular 依赖项注入失败,我收到标准 angular unknown provider myProvider
错误。当我将 singleRun
属性 更改为 false
时,大多数单元测试都通过了(尽管其中一组仍然失败)。
测试已经(并且仍然)在 Chutzpah 中运行良好。
我尝试将测试减少到准系统:
var myProvider;
beforeEach(module('MyModule'));
beforeEach(inject(function (_my_) {
myProvider = _my_;
}));
it("exists", function () {
expect(myProvider).not.toBeUndefined();
});
它仍然失败并出现 unknown provider myProvider
错误。同样,如果我将 singleRun
设置为 false
,它们 运行 没问题。我试过 运行ning PhantomJS 和 Chrome,它们都表现出完全相同的行为。
我正在使用 angular 1.4.7,我在 package.json 中的依赖项看起来像
"dependencies": {
"gulp": "^3.9.0",
"gulp-chug": "^0.4.2",
"gulp-install": "^0.6.0",
"gulp-util": "^3.0.7",
"phantomjs": "^1.9.19",
"jasmine-core": "^2.4.1",
"karma": "^0.13.19",
"karma-jasmine": "^0.3.6",
"karma-phantomjs-launcher": "^0.2.3",
"karma-spec-reporter": "^0.0.23",
"karma-chrome-launcher": "^0.2.2"
}
karma.conf.js:
module.exports = function (config) {
config.set({
frameworks: ["jasmine"],
reporters: ["spec"],
browsers: ["PhantomJS"],
files: [
"./path/to/jquery/jquery-1.11.0.min.js",
"./path/to/angular/angular.js",
"./path/to/angular/angular-route.js",
"./path/to/angular/angular-mocks.js",
// I'm using this path order (app -> modules -> all)
// due to recommendations found on SO
"./path/to/application/app.js",
"./path/to/application/**/*Module.js",
"./path/to/application/**/*.js",
// For now, I'm just running the one test to simplify debugging
"./path/to/tests/myTest.Test.js"
]
});
};
有什么想法吗?
你的 Karma conf 看起来太简单了。您需要在 karma conf 中定义预处理器。您需要预加载 Angular Javascript 文件。您还应该预加载 HTML 个文件。如果测试 HTTP,您也可能想要预加载 angular 模拟。这应该会给你一个先机。有任何具体问题请询问。
'use strict';
module.exports = function (config) {
config.set({
basePath: './',
browsers: ['PhantomJS'],
frameworks: ['jasmine'],
reporters: ['mocha', 'coverage'],
singleRun: true,
preprocessors: {
'src/**/!(*spec)*.js': ['coverage'],
'dest/**/*.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
stripPrefix: 'dest/',
moduleName: 'ngHtmlFiles'
},
coverageReporter: {
type: 'html',
dir: 'coverage'
},
files: [
'dest/vendor.min.js',
'bower_components/angular-mocks/angular-mocks.js',
'src/**/*.js',
'dest/**/*.html'
]
});
};
事实证明,我们的自定义 angular 提供程序具有内部依赖性,由于某种原因,singleRun: true
无法解决这些问题。
我在 karma.conf 中专门设置了这些文件的加载顺序,以便依赖项按 "correct" 顺序加载,现在我得到与 运行 [=11 时相同的结果=](与 singleRun:false
相同的少数测试仍然失败,但这是另一回事)。
这与 Chutzpah 一起工作的原因是那些引用(在每个单独的测试文件中列出)的顺序是正确的。