Javascript angularjs测试中的依赖关系处理
这是为了工作(我有权限),所以我不能发布准确的代码 所以我必须测试一个大模块的控制器。该模块具有一个大型配置函数,其中包含一组控制器,用于不同页面的逻辑 对于实际应用程序,它加载了bower,这很令人恼火,因为我正在使用和npm进行测试。因此,依赖关系是一团乱。我基本上必须导入从bower.json加载到package.json的所有内容 这是我的karma.conf.js:Javascript angularjs测试中的依赖关系处理,javascript,angularjs,node.js,browserify,karma-mocha,Javascript,Angularjs,Node.js,Browserify,Karma Mocha,这是为了工作(我有权限),所以我不能发布准确的代码 所以我必须测试一个大模块的控制器。该模块具有一个大型配置函数,其中包含一组控制器,用于不同页面的逻辑 对于实际应用程序,它加载了bower,这很令人恼火,因为我正在使用和npm进行测试。因此,依赖关系是一团乱。我基本上必须导入从bower.json加载到package.json的所有内容 这是我的karma.conf.js: module.exports = function(config) { config.set({ baseP
module.exports = function(config) {
config.set({
basePath: 'resources',
browserify: {
debug: true,
transform: [ 'browserify-shim' ]
},
browsers: [ 'PhantomJS' ],
captureTimeout: 60000,
client: {
mocha: {}
},
files: [
'tests/assist/test.js',
'assets/scripts/libs/logger.min.js'
],
frameworks: [ 'browserify', 'phantomjs-shim', 'mocha', 'chai' ],
port: 8080,
preprocessors: {
'tests/assist/controller.js': [ 'browserify' ]
},
reporters: [ 'mocha', 'coverage' ],
singleRun: true
});
};
下面的代码是我的test.js(删除一些特定于公司的名称)。我还需要放angular.mock。否则就不行了
require('angular');
require('angular-mocks');
//Main module needs these
jQuery = require('jquery');
require('angular-bootstrap');
require('angular-recaptcha');
require('angular-ui-router');
require('ngstorage');
require(**The path to the main module**);
require(**The path to a service it uses**);
require(**The path to a service it uses**);
require(**The path to a service it uses**);
describe('Blah', function () {
beforeEach(angular.mock.module('myApp'));
var $controller;
beforeEach(angular.mock.inject(function(_$controller_) {
$controller = _$controller_;
}));
describe('blahblah', function () {
it('sets loading to true', function () {
var $scope = {};
var controller = $controller('controller', {$scope: $scope});
assert($scope.showLoading === true);
});
});
});
主要模块:
(function() {
'use strict';
})();
// Jquery noconflict
jQuery.noConflict();
var myApp = angular.module('myApp', ['ui.router', 'ngStorage', 'vcRecaptcha', 'ui.bootstrap']);
myApp.config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function($stateProvider, $urlRouterProvider, $locationProvider) {
...
}])
.run([blah bunch of dependencies]) {
...
}]);
控制器(单独的fie):
正如你所看到的,我在地狱里。我在angular站点上进行了示例测试,主要问题是控制器看不到依赖项和myApp控制器/服务中的“引用错误:找不到变量:myApp”
如果有人有更好的测试方法,我洗耳恭听。这不是依赖地狱,也不是测试 代码似乎依赖于
myApp
全局变量,这与角度模块的用途完全相反
myApp
应该是在每个函数作用域中动态定义的局部变量
(function () {
var myApp = angular.module('myApp', [...]);
...
})();
这与依赖性无关,也与测试无关 代码似乎依赖于
myApp
全局变量,这与角度模块的用途完全相反
myApp
应该是在每个函数作用域中动态定义的局部变量
(function () {
var myApp = angular.module('myApp', [...]);
...
})();
我不一定有更好的测试方法,因为我有一个建议。Angularjs并不意味着要用一堆控制器来编写,事实上在Angular2中,他们完全取消了控制器,因为人们错过了使用它们。我建议回顾一下这些文件,并考虑走一条更具指导性的中心路线。我的公司最近从控制器切换到工厂和指令,并注意到一个重大的改进。谢谢评论。我只是一名实习生,所以我只需要测试一个我没有编写的代码库,所以我不能真正做任何转换等。希望埃斯图斯的回答能解决这个问题。我没有更好的测试方法,因为我有一个建议。Angularjs并不意味着要用一堆控制器来编写,事实上在Angular2中,他们完全取消了控制器,因为人们错过了使用它们。我建议回顾一下这些文件,并考虑走一条更具指导性的中心路线。我的公司最近从控制器切换到工厂和指令,并注意到一个重大的改进。谢谢评论。我只是一名实习生,所以我只需要测试一个我没有编写的代码库,所以我不能真正做任何切换等。希望estus的回答能够解决这个问题。如果你有10个控制器,并且想清理一下,你还可以在另一个js文件中使用你的控制器,这难道不是正确的吗。您只需通过角度引用模块,而不是通过如上所述的全局变量。例如:角度。模块('myApp')。控制器(……)请忽略此项comment@Ohjay44当然,这是一个偏好的问题。对于单控制器定义来说,它可能是多余的,但对于样式一致性是有益的。嘿,estus,它修复了我的“找不到myApp”问题,谢谢!整个测试仍然不起作用,我想至少还有5个错误需要处理,哈哈。现在我有了:null不是一个对象(evauting'document.getElementById(“appURL”).value)。如果您知道如何修复它的话。错误在一个服务文件中。@patrickd很可能是因为元素不在DOM中,
getElementById(“appURL”)
返回null。请记住,Angular specs中的根元素与DOM分离,所有DOM调用最好都是模拟的。请随时就每个问题提出相关问题。如果您有10个控制器,并且想稍微清理一下,那么您还可以在另一个js文件中使用控制器,这难道不正确吗?Y您只需要通过angular而不是像上面所说的通过全局变量引用模块。例如:angular.module('myApp')。controller(…)请忽略这一点comment@Ohjay44当然,这是一个偏好的问题。它可能对单控制器定义是多余的,但对样式一致性是有益的。嘿,estus,它修复了我的“找不到我的应用程序”问题,谢谢!整体测试仍然不起作用,我想至少还有5个错误需要处理哈哈。现在我有了:null不是一个object(evaluating'document.getElementById(“appURL”).value。如果您知道如何修复它,则返回值。错误在服务文件中。@patrickd很可能是因为元素不在DOM中,并且getElementById(“appURL”)
返回null。请记住,Angular specs中的根元素与DOM分离,所有DOM调用最好都是模拟的。请随时发布关于每个问题的相关问题。
(function () {
var myApp = angular.module('myApp');
myApp.controller('controller', ...)
...
})();