angularjs - 单元测试组件 Angular

标签 angularjs unit-testing angular-mock

我正在尝试对我的组件 Controller 进行单元测试,但出现以下错误。谁能告诉我,这里有什么问题?

我的依赖:

  • Angular 1.5.6
  • Angular 模拟 1.5.7
  • 摩卡咖啡 2.5.3
  • 业力 0.13.22

  • 错误:
    modalCleanup component "before all" hook: workFn FAILED
        Error: [$injector:unpr] Unknown provider: $elementProvider <- $element
        http://errors.angularjs.org/1.5.7/$injector/unpr?p0=%24elementProvider%20%3C-%20%24element
            at /home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:230:13
            at /home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:4664:20
            at Object.getService [as get] (/home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:4817:40)
            at /home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:4669:46
            at getService (/home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:4817:40)
            at injectionArgs (/home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:4841:59)
            at Object.instantiate (/home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:4883:19)
            at $controller (/home/mixtape/web/repo/mailer/server/public/assets/js/vendor.js:10411:29)
            at /home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:2345:13
    
            at $componentController (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:2388:15)
        Error: Declaration Location
            at Object.window.inject.angular.mock.inject [as inject] (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:3171:26)
            at Suite.<anonymous> (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:3271:24)
            at Object.<anonymous> (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:3260:2)
            at __webpack_require__ (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:20:30)
            at Object.<anonymous> (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:63:96)
            at __webpack_require__ (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:20:30)
            at Object.<anonymous> (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:4611:75)
            at __webpack_require__ (/home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:20:30)
            at /home/mixtape/web/repo/mailer/server/public/assets/js/specs.js:55:18
       Chrome 51.0.2704 (Linux 0.0.0): Executed 78 of 78 (1 FAILED) (0.437 secs / 0.118 secs)
    

    组件:
    "use strict";
    
    import template from "./template.html";
    import "./style.styl";
    
    export default {
     template: template,
     controller: function(MailboxesApi, ErrorHandler, MailboxesStore, Notify, LettersStore, $element, $state, $rootScope) {
      "ngInject";
    
    Object.defineProperty(this, "removing", {
      get: function() {
        return MailboxesApi.removing;
      }
    });
    
    $rootScope.$on("modal.cleanup.open", () => this.open());
    
    this.close = () => {
      $element.removeClass("w-cleanup_opened");
      $element.off("click");
    };
    
    this.open = () => {
      $element.addClass("w-cleanup_opened");
      $element.on("click", () => this.close());
    };
    
    this.preventBubbling = e => e.stopPropagation();
    
    this.confirmHandler = () => {
      let selected = MailboxesStore.selected;
    
      MailboxesApi.cleanup(selected)
        .then(() => {
    
          LettersStore.deselectAll();
          LettersStore.removeAll(selected);
          this.close();
          Notify.add("The mailbox was successfully cleaned!");
          $state.reload();
    
        }, err => {
          this.close();
    
          ErrorHandler.handle(err);
        });
    };
    
    }
    };
    

    测试:
    "use strict";
    
    describe("modalCleanup component", function() {
     let modalCleanupController, $componentController;
    
     angular.mock.module.sharedInjector();
    
     before(angular.mock.module("app"));
    
     before(angular.mock.module(function($urlRouterProvider) {
       $urlRouterProvider.deferIntercept();
     }));
    
     before(angular.mock.inject(function(_$componentController_) {
       $componentController = _$componentController_;
     modalCleanupController = $componentController("modalCleanup", null);
      }));
    
     it("test...", function() {});
    
     });
    

    最佳答案

    您需要为 $componentController 函数提供 $element ,因为您在 Controller 定义中使用它。
    您可以在单元测试中定义类似的 smtg:

    var element = angular.element('<button></button>');
    modalCleanupController = $componentController("modalCleanup",  {
         //create an empty scope
         $scope: {},
         $element: element
    });
    

    关于angularjs - 单元测试组件 Angular ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37938119/

    相关文章:

    angular - typescript 导入错误的 Angular

    angularjs - Angular.mock.$interval.flush() 抛出奇怪的异常

    javascript - 使用 Jasmine 中的原型(prototype)测试 Angular Factory

    javascript - AngularJS - 如果结果数组中没有相同的项目,则隐藏类别

    javascript - isolateScope() 给出未定义的 - 使用 Karma 的单元测试指令

    java - 测试 - 具有内部私有(private)方法的 lambda?

    c# - 出于单元测试目的,如何更改 "today' 的日期?

    javascript - CSS 网格效果问题

    AngularJS-范围不是ng-repeat的ng-click事件中所期望的

    html - href 覆盖 Angular.js 中的 ng-click