0

イオン モーダル コントローラーのテストで問題が発生しています。問題 (または少なくとも私が注目している問題) は、 $ionicModal.fromTemplateUrl 関数のモックアップです。イオンのドキュメントによると、モーダルのインスタンスに解決される promise を返すことになっています。

ここに私の工場があります:

(function() {
  'use strict';

  angular.module('penta.app.main').factory('addEquipment', AddEquipment);

  function AddEquipment($rootScope, $ionicModal) {
    return {
      openModal: function() {
        var scope = $rootScope.$new(true);
        scope.controller = new AddEquipmentController(scope, $ionicModal);
      }
    };

    function AddEquipmentController(scope, $ionicModal) {
      var controller = this;

      $ionicModal.fromTemplateUrl('app/tracking/activityLog/addItems/equipment/addEquipment.html', {
        scope: scope,
        animation: 'slide-in-up'
      }).then(function(modal) {
        controller.modal = modal;
        controller.openModal();
      });


      controller.openModal = function() {
        controller.modal.show();
      };

      controller.closeModal = function() {
        controller.modal.hide();
      };

      return controller;
    }
  }
})();

そして、ここに私のテストがあります:

(function() {
  'use strict';

  describe('AddEquipment', function() {
    var controllerConstructor;
    var addEquipment;
    var mock;
    var mockIonicModal;
    var mockModal;
    var scope;
    var dfd;

    beforeEach(module('penta.app.main'));
    beforeEach(module('unitTest'));
    beforeEach(module('app/tracking/activityLog/addItems/equipment/addEquipment.html'));

    beforeEach(function() {
      mockModal = sinon.stub({
        show: function() {
        },

        hide: function() {
        }
      });

      mockIonicModal = sinon.stub({
        fromTemplateUrl: function() {
        },

        then: function() {
        }
      });
      mockIonicModal.fromTemplateUrl.returns(mockModal);
    });

    beforeEach(function() {
      module(function($provide) {
        $provide.value('$ionicModal', mockIonicModal);
      });
    });

    beforeEach(inject(function($rootScope, $controller, $q, ptiMock) {
      controllerConstructor = $controller;
      dfd = $q.defer();
      scope = $rootScope.$new();
      mock = ptiMock;
      mockModal.$promise = dfd.promise;
    }));

    beforeEach(inject(function(_addEquipment_) {
      addEquipment = _addEquipment_;
    }));

    it('exists', function() {
      expect(addEquipment).to.exist;
    });

    describe('open', function() {
      it.only('opens the modal', function() {
        addEquipment.openModal();
        dfd.resolve(mockModal);
        scope.$digest();

        expect(mockIonicModal.show.calledOnce).to.be.true;
      });
    });

    function getController() {
      return mockIonicModal.fromTemplateUrl.lastCall.args[0].scope.controller;
    }
  });
})();

getController 関数がコントローラーを正しく返すかどうかもわかりません。$ionicModal を使用するのはこれが初めてなので、ご指摘いただければ幸いです。ありがとう。

4

1 に答える 1