I run my angular tests with karma, my application is running fine in browser, but tests fails and I am suspecting wrong settings.
我用karma运行我的角度测试,我的应用程序在浏览器中正常运行,但测试失败,我怀疑设置错误。
Here are the controllers and tests :
这是控制器和测试:
// app/scripts/controllers/main.js
'use strict';
angular.module('GloubiBoulgaClientApp')
.controller('MainCtrl', function ($scope) {
});
Here is the test file :
这是测试文件:
'use strict';
describe('Controller: MainCtrl', function () {
// load the controller's module
beforeEach(module('GloubiBoulgaClientApp'));
var MainCtrl,
scope;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
MainCtrl = $controller('MainCtrl', {
$scope: scope
});
}));
it('should attach a list of awesomeThings to the scope', function () {
expect(true).toBe(true);
});
});
The karma conf
因果报应
module.exports = function(config) {
config.set({
// base path, that will be used to resolve files and exclude
basePath: '',
// testing framework to use (jasmine/mocha/qunit/...)
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/angular-COOKIEs/angular-COOKIEs.js',
'app/bower_components/angular-sanitize/angular-sanitize.js',
'app/scripts/*.js',
'app/scripts/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
],
// list of files / patterns to exclude
exclude: [],
// web server port
port: 8080,
// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: ['PhantomJS'],
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false
});
};
The error ouput
错误输出
PhantomJS 1.9.2 (Linux) Controller: MainCtrl should attach a list of awesomeThings to the scope FAILED
Error: [ng:areq] Argument 'MainCtrl' is not a function, got undefined
http://errors.angularjs.org/1.2.8-build.2094+sha.b6c42d5/ng/areq?p0=MainCtrl&p1=not%20a%20function%2C%20got% 2
0undefined
at assertArg (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angula
r.js:1362)
at assertArgFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angu
lar.js:1373)
at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.js:6763
at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/test/spec/controllers/main.js:15
at invoke (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.j
s:3704)
at workFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular-mocks/angular -mocks.js:2120)
I am wondering why this happen, I tried to find some documentation about the karma initialization with angularjs. But the most documentation I found is only dummy tutorial that are repeating the same pattern ( like the dummy todo list, but with phones ... )
我想知道为什么会发生这种情况,我试图找到一些关于使用angularjs进行业力初始化的文档。但我找到的大多数文档只是重复相同模式的虚拟教程(如虚拟待办事项列表,但与手机...)
It seem that $controllerProvide.register fails to resolve my controllers name. But Directives tests are working correctly ...
好像$ controllerProvide.register无法解析我的控制器名称。但指令测试工作正常......
Thanks for your attention.
感谢您的关注。
Edit Notes : I replaced the controller PersonCtrl by MainCtrl in this thread because It was confusing people about where to look. Now MainCtrl is the simpliest failing example I found.
编辑注释:我在这个帖子中用MainCtrl替换了控制器PersonCtrl,因为它让人们在哪里看起来很困惑。现在,MainCtrl是我发现的最简单的失败示例。
This issue is only affecting my controllers, ( all of them ), but tests for Services and Directives are working as expected
此问题仅影响我的控制器(所有这些),但服务和指令的测试正在按预期工作
10
I solved my problem, I've spent nearly a week to figure why this was not working.
我解决了我的问题,我花了将近一个星期来解释为什么这不起作用。
I'd like to warn you, that Karma Stacktrace and error reports, even in debug mode, were not showing clues and were mainly missleading. I've spent time in Javascript debugger jumping frame to frame, to understand why my controllers where not loaded. ( Inspecting Angular's controllers register, shown it was empty)
我想警告你,Karma Stacktrace和错误报告,即使在调试模式下,也没有显示线索,主要是误导。我花时间在Javascript调试器中跳帧到帧,以了解为什么我的控制器没有加载。 (检查Angular的控制器寄存器,显示它是空的)
While digging in my directories I've found a *.js that were not loaded in the index in production but by the globbing pattern in tests.
在挖掘我的目录时,我发现了一个* .js,它们没有在生产中的索引中加载,而是在测试中通过globbing模式加载。
It was my old http_interceptor service that I moved but did not trashed the file. Removing this buggy file fixed the weird Karma/Jasmine/Angular behaviour.
这是我移动的旧的http_interceptor服务,但没有删除该文件。删除这个buggy文件修复了奇怪的Karma / Jasmine / Angular行为。
Lesson learned : Do not trust tests output ( but what should I trust then ? ). Remove files you are not using/testing.
获得的经验教训:不要相信测试输出(但我应该相信什么?)。删除您未使用/测试的文件。
Thanks to everyone who tryied to solve this issue.
感谢所有试图解决这个问题的人。
8
i think the main problem is coming from the karma conf :
我认为主要问题来自业力骗局:
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/angular-COOKIEs/angular-COOKIEs.js',
'app/bower_components/angular-sanitize/angular-sanitize.js',
'app/scripts/*.js',
'app/scripts/**/*.js',
'app/scripts/**/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
],
removing the * and specifying files one by one in the correct order, because if one is loaded before another it can break.
删除*并以正确的顺序逐个指定文件,因为如果一个在另一个之前加载它可能会中断。
Edit : Add your files in the same order as your index.html
编辑:按照与index.html相同的顺序添加文件
1
looking at this I'm wondering if the error message is confusing things.
看着这个,我想知道错误信息是否令人困惑。
in the stack trace i can see
在堆栈跟踪中,我可以看到
TypeError: 'undefined' is not an object (evaluating 'scope.awesomeThings.length')
and from the example it does seem as though you have not defined any properties on the scope in your controller.
从示例中看起来好像您没有在控制器中的范围上定义任何属性。
do you still have the problem if you add
如果添加,你还有问题吗?
$scope.awesomeThings = [];
to your controller?
你的控制器?
1
If you're using the latest angular and also using the angular-route module, you should include the angular-route script in the karma conf file too:
如果您使用的是最新的角度并且还使用了角度路径模块,那么您也应该在karma conf文件中包含angular-route脚本:
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-route/angular-route.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/angular-COOKIEs/angular-COOKIEs.js',
'app/bower_components/angular-sanitize/angular-sanitize.js',
'app/scripts/*.js',
'app/scripts/**/*.js',
'app/scripts/**/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
],
I had this problem and adding it to the karma file did the trick.
我有这个问题,并将其添加到业力文件就行了。