我正在处理一个非平凡的应用程序,具有以下文件夹结构:
build (required files such as angular.js)
Gruntfile.js
karma.conf.js
logs/
node_modules/
src/
- app/
- app.js
- module_name/
- module.js
- controllers/
- controller1.js
- controller2.js
- views/
- view1.html
- assets/
- 1.jpg
- styler.css
- components/ (plugged in modules [angular-ui, etc])
- index.html
我的控制器都附加到其父模块。然后在我的app.js文件中需要该模块。
我曾尝试编写一些单元测试,但我似乎一直遇到依赖性问题,因为我尝试测试的控制器需要它的模块,然后该模块需要另外一个,等等。
我的问题有几个部分:
如何构建我的karma.conf.js文件以包含必要的文件? 特别是这部分配置:
files: [
'files_to_be_tested.js',
]
使用Jasmine,如何使用所有正确的依赖项编写单元测试?例如,我运行以下测试
的Javascript
using 'strict'
describe('my Module', function() {
describe('myController', function() {
var ctrl, scope;
beforeEach(module('myModule'));
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('myController', { $scope: scope });
}));
it('should work', function() {
// Execute functionality
})
})
})
但是我一直收到错误:Unknown provider: $stateProvider
,我认为它来自加载模块的路由配置。
我开始怀疑我是否正确地将控制器分离出来了?
答案 0 :(得分:6)
回答第二个问题:
Unknown provider: $stateProvider
是由ui.router
模块未加载引起的。要解决此问题,请添加beforeEach(module('ui.router'))
问题出现是因为您正在加载的控制器正在尝试注入$state
确保ui.router
Javascript文件位于files
的{{1}}列表中,否则该模块将无法用于业力。
答案 1 :(得分:3)
以下是您的第一个问题的答案。配置文件部分;
// list of files / patterns to load in the browser
files = [
JASMINE,
JASMINE_ADAPTER,
'components/angular/angular.js', //path to your angular.js file
'components/angular-mocks/angular-mocks.js',//path to your angular-mocks.js file
'components/angular-resource/angular-resource.js',//path to your angular-resource.js file
'app/*.js',
'app/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
];
在karma.conf.js中尝试此更改并执行测试。希望它有所帮助。
答案 2 :(得分:0)
与您的应用程序相同的文件/模式,顺序相同,然后是angular-mock,然后是您的规格。
如果您正在加载模块,则应该已经加载了所有相关模块。由于您缺少一个提供程序而您的示例只调用一个控制器,因此$controller('myController', { $scope: scope });
中注入的控制器依赖项可能会丢失它。