Angularjs 将angular.element(';*[ng app]';).injector()与karma+;茉莉花

Angularjs 将angular.element(';*[ng app]';).injector()与karma+;茉莉花,angularjs,dependency-injection,karma-jasmine,Angularjs,Dependency Injection,Karma Jasmine,我有一个angular 1应用程序,我正在以一种非常定制的样式编写,因此切换到angular 2更为直接,因此,例如,不使用angular.service()在angular中创建服务,并使用依赖项注入的正常方式,而是创建一个原始类型脚本(或ES2015样式)类。在浏览器中正常运行时,以下所有代码都会正常运行 问题特别在于一行: Auth.jwtHelper = angular.element('*[ng-app]').injector().get('jwtHelper'); 业力中抛出的错误

我有一个angular 1应用程序,我正在以一种非常定制的样式编写,因此切换到angular 2更为直接,因此,例如,不使用
angular.service()
在angular中创建服务,并使用依赖项注入的正常方式,而是创建一个原始类型脚本(或ES2015样式)
。在浏览器中正常运行时,以下所有代码都会正常运行

问题特别在于一行:

Auth.jwtHelper = angular.element('*[ng-app]').injector().get('jwtHelper');
业力中抛出的错误是:

Uncaught TypeError: Cannot read property 'get' of undefined
很自然,这意味着喷油器没有被定位。同样,在浏览器中正常运行时,这绝对可以100%正常工作。另外,值得注意的是,在jQuery DOM ready事件
$(函数{…})上发生的服务实例化时调用这一行

模块引导是以使用
的常规文档化方式完成的,
ng app
指令可以移动到
,因为应用程序不像以前那样需要
元素中的作用域。也许这就是因果报应在这个召唤中窒息的原因


更新:将
ng应用程序
移动到
没有产生任何变化

我已经翻阅了一些angular mock源代码和.d.ts文件,试图找到任何替代方法来获取应用程序的注入器,但到目前为止还没有看到任何可以使用的方法

我正在寻找的是建设性的建议,不需要使用angular的典型注入模式的替代方案,或者任何其他可能有用的花边新闻

正如所料,由于这是一种非常不典型的方法,谷歌搜索结果并没有带来很大帮助

更新:

在这个问题上有更多的背景

export class Auth{
    public static jwtHelper;

    public static init(){
        Auth.jwtHelper = angular.element('*[ng-app]').injector().get('jwtHelper');
    }
}
$(Auth.init);

正如您在这里看到的,init方法是在DOM就绪时调用的,而不是从单元测试调用的。我不能提供单元测试的描述块,因为它与我的单元测试分开运行。这是应用程序加载的一部分。

我意识到这是一个相当老的问题,但鉴于我刚刚遇到了同样的问题,我想我应该在那里为下一个家伙发布我的解决方案

您需要做的是monkey patch
angular.element
,这样它就会返回喷油器:

beforeEach(angular.mock.inject(['$injector', function(injector) {
  // save original
  var original = angular.element;

  // replace with our own
  angular.element = function() {
    // proxy all calls to the original
    var result = original.apply(this, arguments);

    // add the injector to the result
    result.injector = function() { return injector; };
    return result;
  }

  // also add all the angular.element properties to our fake or some other stuff will break
  for (let prop in original) {
    angular.element[prop] = original[prop];
  }
}]));

将该位放在规范中的
angular.mock.module()
声明之后,就可以开始了

我也遇到了同样的错误,并通过以下方法解决了这个问题

注意:我使用的是Typescript

let SampleController, $injector;

(<any>angular).mock.inject(($componentController, _$injector_) => {
     $injector = _$injector_;

     // angular.element(document.body).injector() doesn't behave correctly because we don't have ng-app in the DOM for unit tests. Spy the injector response instead.
     spyOn(angular.element.prototype, "injector").and.callFake(() => {
         return $injector;
     });

     // angular.element is triggered in the super of SampleController
     SampleController = $componentController("SampleComponent", null);
});
let SampleController,$injector;
(角度).mock.inject($componentController,$injector)=>{
$injector=\$injector;
//angular.element(document.body).injector()行为不正确,因为DOM中没有用于单元测试的ng应用程序。请监视喷油器响应。
spyOn(angular.element.prototype,“injector”).和.callFake(()=>{
返回$1注射器;
});
//angular.element在SampleController的super中触发
SampleController=$componentController(“SampleComponent”,null);
});

我认为这有点简单,因为您关注的是angular的原型。element

请提供本规范的上下文。目前尚不清楚在您的案例中如何进行模块引导。是的,模块引导是使用
元素上的
ng app
属性完成的,并允许angular自动引导应用程序。将
ng app
移动到
似乎没有任何效果,而且我不能真正向下移动,因为我的
元素有一个它需要的
ng类样式。我的意思是“描述”块中到底发生了什么。在哪里加载“ngMock”模块?通常使用ngMock将模块注入测试代码中。请发布相关的单元测试代码。太棒了,我从来没有解决过这个问题,只是转到Angular 2。希望这对其他人有所帮助。请记住在应用程序初始化后使用此代码。