使用Jasmine& amp;测试一个非平凡的AngularJS应用程序因果报应

时间:2013-08-26 04:41:50

标签: unit-testing testing angularjs jasmine

我正在处理一个非平凡的应用程序,具有以下文件夹结构:

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文件中需要该模块。

我曾尝试编写一些单元测试,但我似乎一直遇到依赖性问题,因为我尝试测试的控制器需要它的模块,然后该模块需要另外一个,等等。

我的问题有几个部分:

  1. 如何构建我的karma.conf.js文件以包含必要的文件? 特别是这部分配置:

    files: [
       'files_to_be_tested.js',
    ]
    
  2. 使用Jasmine,如何使用所有正确的依赖项编写单元测试?例如,我运行以下测试

  3. 的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,我认为它来自加载模块的路由配置。

    我开始怀疑我是否正确地将控制器分离出来了?

3 个答案:

答案 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)

  1. 与您的应用程序相同的文件/模式,顺序相同,然后是angular-mock,然后是您的规格。

  2. 如果您正在加载模块,则应该已经加载了所有相关模块。由于您缺少一个提供程序而您的示例只调用一个控制器,因此$controller('myController', { $scope: scope });中注入的控制器依赖项可能会丢失它。