1

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

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,我如何编写具有所有适当依赖项的单元测试?例如,我运行以下测试

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

我开始怀疑我是否已经正确地分离了我的控制器?

4

3 回答 3

6

回答第二个问题:

Unknown provider: $stateProviderui.router模块未加载引起的。要解决问题,请添加beforeEach(module('ui.router'))

出现问题是因为您正在加载的控制器正在尝试注入$state

确保ui.routerJavascript 文件在files列表中,karma.conf.js否则 karma 将无法使用该模块。

于 2014-06-18T18:49:53.370 回答
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 中尝试此更改并执行您的测试。希望能帮助到你。

于 2013-08-26T05:21:21.583 回答
0
  1. 与您的应用程序相同的文件/模式,以相同的顺序,然后是角度模拟,然后是您的规格。

  2. 如果你正在加载一个模块,它应该已经加载了它的所有依赖模块。由于您缺少提供程序,并且您的示例仅调用了一个控制器,因此在$controller('myController', { $scope: scope });.

于 2015-08-26T18:39:34.077 回答