2015-03-02 33 views
1

所以,我有一套角度测试,使用茉莉花和业力。我有一个模块lodash和这样的定义像这样

(function (angular) { 

    var lodash = angular.module('lodash', []); 

    lodash.factory('_', ['$window', function ($window) { 
     //lodash must already be loaded on the page 

     var _ = $window._; 

     delete ($window._); 

     return _ ; 
    }]); 

    var moment = angular.module('moment', []); 

    moment.factory('moment',['$window',function ($window) { 

     var toReturn = $window.moment; 

     delete ($window.moment); 

     return toReturn; 
    }]); 

})(angular); 

这一切都可以在我的应用程序没有问题。为什么我会收到这条消息,当我不确定地从方法中返回一个“_”对象?使用

(function (angular) { 

    'use strict'; 

    var controllerId = 'batchSearchCtrl'; 

    angular.module('app').controller(controllerId, batchSearchCtrl); 

    batchSearchCtrl.$inject = ['$scope', '$routeParams', 'batchSearchViewModel', 'modalSvc', '_']; 

    function batchSearchCtrl($scope, $routeParams, batchSearchViewModel, modalSvc, _) { 
    } 
})(angular); 

这里的

例子是因果报应文件(不完整的文件只是部分处理的文件加载)

module.exports = function (config) { 
    config.set({ 

     // base path, that will be used to resolve files and exclude 
     basePath: '../app', 

     // frameworks to use 
     frameworks: ['jasmine'], 

     // list of files/patterns to load in the browser 
     files: [ 
      'https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.js' 
     , 'http://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular-resource.js' 
     , 'http://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular-route.js' 
     , 'http://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular-animate.js' 

     , '../node_modules/angular-mocks/angular-mocks.js' 

     , '../components/**/*.js' 

     , '../scripts/sinon-1.7.3.js' 
     , '../scripts/base64.js' 

     , '../scripts/moment-2.4.0.js/moment-with-langs.js' 
     , '../scripts/watch-1.3.0.js/watch.js' 
     , '../scripts/jquery/jquery.js' 
     , '../scripts/bootstrap/bootstrap.js' 
     , '../scripts/ui-bootstrap/ui-bootstrap-tpls-0.10.0.js' 
     , '../scripts/lodash/lodash-3.0.0.js' 
     , '../scripts/watch/watch-1.3.0.js' 

     , '../scripts/scriptModules.js' 
     , '../common/module.js' 
     , 'app.js' 

     , '../common/*.js' 
     , '../common/**/*.js' 

     , '*.js' // all js files in root app folder 
     , 'app_directives/**/*.js' 
     , 'batch/*.js' 
     , 'batch/closing/*.js' 
     , 'batch/search/*.js' 
     , 'batch/summary/*.js' 
}); 
}; 
+0

只是一个预感:有时候在测试的beforeEach()中,你想注入一个服务/工厂和r在您的测试中使用同名的局部变量引用它。你可以这样做:/ var $ compile; beforeEach(inject(function(__ compile_){$ compile = _ $ compile_;}));''''''''''''''''''''我猜你的名为'_'的服务正在从名称中剥离“_”以支持上述注入句法。 – 2015-03-02 16:23:45

+0

你的'karma.conf'看起来像什么?加载'angular-mock'后,你应该加载'lodash'和'moment'。 – 2015-03-02 16:24:17

回答

0

我出去在评论肢体,和经过一点挖掘,我相信我是对的。正在从您的服务名称中删除“_”,在mock injector的测试中。

具体地,读取部Resolving References (Underscore Wrapping)

为了解决这个问题,注入参数可以任选地用下划线包围。参考名称解析后,这些被喷油器忽略。

我似乎无法找到正在这样做的实际source code。然而,我的诊断似乎是由这两个事实的支持:

  • 您可以使用相同的技术以声明moment.js服务,并没有任何问题
  • 的问题只发生在测试中,在那里模拟注射器使用/支持下划线包装。

编辑:

潜在的变通方法测试:

在当你创建你的控制器,使用下划线包装技术来检索您的lodash服务,像这样的测试代码:

var controller, scope; 
beforeEach(inject(function($rootScope, $controller, ___) { 
    scope = $rootScope.$new(); 
    controller = $controller('batchSearchCtrl', {$scope: scope, _: ___}); 
})); 
+0

我将所有声明都转换为我使用'lodash'作为模块名称,然后在文件之前声明变量var _ = lodash;我所有的测试都在工作:) – epitka 2015-03-02 18:26:22

相关问题