2015-09-03 26 views
0

我在測試離子模態控制器時遇到了麻煩。問題(或者至少是我關注的問題)是模擬$ ionicModal.fromTemplateUrl函數。根據離子文件,它應該返回一個可以解析爲模態實例的承諾。

這裏是我廠:

(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,所以任何指針都會被讚賞。謝謝。

回答

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