0

我在测试离子模态控制器时遇到问题。问题(或者至少是我关注的问题)是模拟 $ionicModal.fromTemplateUrl 函数。根据 ionic 文档,它应该返回一个解析为模态实例的承诺。

这是我的工厂:

(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

0

固定的:

我没有正确设置dfd。此外,当它是 mockModal 的功能时,我将节目设置为 mockIonicPopup 的功能。

(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() {
        }
      });
    });

    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;
      mockIonicModal.fromTemplateUrl.returns(dfd.promise);
    }));

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

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

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

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

    function getController() {
      return mockIonicModal.fromTemplateUrl.lastCall.args[0].scope.controller;
    }
  });
})();
于 2015-09-03T18:04:36.407 回答