Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度单元测试工厂注射_Angularjs_Unit Testing_Karma Jasmine - Fatal编程技术网

Angularjs 角度单元测试工厂注射

Angularjs 角度单元测试工厂注射,angularjs,unit-testing,karma-jasmine,Angularjs,Unit Testing,Karma Jasmine,我看到了答案,但没有一个解决方案对我有效。我得到一个错误错误:[ng:areq]参数'fn'不是一个函数,未定义,这导致我的测试失败。将工厂注入不是存根工厂的测试规范的正确方法是什么 登录模块 登录控制器 登录控制器规范 单元测试文件 应用程序 日志 应定义Chrome 54.0.2840(Mac OS X 10.11.6)loginController vm.loginUser失败 错误:[$injector:unpr]未知提供程序:storageFactoryProvider测试未加载fot

我看到了答案,但没有一个解决方案对我有效。我得到一个错误
错误:[ng:areq]参数'fn'不是一个函数,未定义
,这导致我的测试失败。将工厂注入不是存根工厂的测试规范的正确方法是什么

登录模块

登录控制器

登录控制器规范

单元测试文件

应用程序

日志

应定义Chrome 54.0.2840(Mac OS X 10.11.6)loginController vm.loginUser失败
错误:[$injector:unpr]未知提供程序:storageFactoryProvider测试未加载
fotaAdminPortal
模块,因此
vsmsCoreFactory
从未注册

此外,无需手动将服务传递到控制器,因为当您创建服务时,注入器将自动执行此操作。当您需要传递非全局注册的服务(即
$scope
或模拟单个控制器实例的服务)时,手动传递服务非常有用

Atm工厂的mock只是一个未定义的变量,当依赖于它们的逻辑试图调用不存在的方法时,会导致错误。您需要在这些模拟上正确地存根任何方法。但暂时将这些放在一边,你的测试应该是这样的:

describe('loginController', function() {

  var $controller;

  beforeEach(module('fotaAdminPortal'));

  beforeEach(inject(function(_$controller_){
    $controller = _$controller_;
  }));

  describe('vm.loginUser', function() {
      it('should be defined', function() {
        var loginController = $controller('loginController');
        expect(loginController.loginUser).toBeDefined();
      });
  });

});
如果要单独加载
loginModule
,则需要将
vsmsCoreFactory
提取到另一个模块中,并将其作为依赖项添加:

angular.module('vsmsCore', [])
  .factory('vsmsCoreFactory', function($http, env, $log, storageFactory) {

  });

angular.module('loginModule', ['ui.bootstrap', 'permission', 'ui.router', 'vsmsCore']);

然后您可以在每个模块(module('loginModule')之前执行
而不是
fotaAdminPortal
是主要的应用程序模块,它由karma('./src/app/index.js')以及
vsmsCoreFactory
('./src/{app,components}/***.factory.js')加载,如单元测试文件所示。karma日志还显示应用程序文件和工厂都已加载
loginModule
fotaAdminPortal
的依赖项。该文件已加载,但除非您使用
module(…)
启动该模块,否则它将永远不会注册。问题是
loginModule
依赖于来自父模块的服务(
vsmsCoreFactory
),因此它是紧密耦合的,不能单独创建。要么启动整个应用程序,要么将服务提取到单独的模块中,并将其作为依赖项添加到
loginModule
Ok,这是有意义的。我为工厂创建了一个
coreModule
,并将其添加为
loginModule
的依赖项,从而解决了
vsmsCoreFactory
未定义的问题。现在,我看到一个未知的提供商:storageFactoryProvider
describe('loginController', function() {

  var $controller;

  beforeEach(module('loginModule'));

  beforeEach(inject(function(_$controller_){
    $controller = _$controller_;
  }));

  describe('vm.loginUser', function() {
    it('should be defined', function() {
      var loginController = $controller('loginController');
      expect(loginController.loginUser).toBeDefined();
    });
  });

});
'use strict';

var gulp = require('gulp');

var $ = require('gulp-load-plugins')();

var wiredep = require('wiredep');

var paths = gulp.paths;

function runTests (singleRun, done) {
  var bowerDeps = wiredep({
    directory: 'bower_components',
    exclude: ['bootstrap-sass-official'],
    dependencies: true,
    devDependencies: true
  });

  var testFiles = bowerDeps.js.concat([
    './src/components/scripts/ui-bootstrap-custom-tpls-2.1.3.js',
    './src/app/index.js',
    './src/{app,components}/**/*.module.js',
    './src/{app,components}/**/*.factory.js',
    './src/{app,components}/**/*.controller.js',
    './src/{app,components}/**/*.spec.js'
  ]);

  gulp.src(testFiles)
    .pipe($.karma({
      configFile: 'karma.conf.js',
      action: (singleRun)? 'run': 'watch'
    }))
    .on('error', function (err) {
      // Make sure failed tests cause gulp to exit non-zero
      throw err;
    });
}

gulp.task('test', function (done) { runTests(true /* singleRun */, done) });
gulp.task('test:auto', function (done) { runTests(false /* singleRun */, done) });
'use strict';

angular.module('fotaAdminPortal',
    [
    'ngAnimate',
    'ngCookies',
    'ngTouch',
    'ngSanitize',
    'ngResource',
    'ui.bootstrap',
    'ui.router',
    'ui.router.stateHelper',
    'pascalprecht.translate',
    'utilsModule',
    'loginModule',
    ...
    ])
describe('loginController', function() {

  var $controller;

  beforeEach(module('fotaAdminPortal'));

  beforeEach(inject(function(_$controller_){
    $controller = _$controller_;
  }));

  describe('vm.loginUser', function() {
      it('should be defined', function() {
        var loginController = $controller('loginController');
        expect(loginController.loginUser).toBeDefined();
      });
  });

});
angular.module('vsmsCore', [])
  .factory('vsmsCoreFactory', function($http, env, $log, storageFactory) {

  });

angular.module('loginModule', ['ui.bootstrap', 'permission', 'ui.router', 'vsmsCore']);