我的代码是:
$scope.openModal = openModal; function openModal(data){ var info = data || {} ModalService.showModal({ templateUrl: ENVApp+"/myview.html",controller: "ModalController",inputs: { icon : "",title: "Additional",data : info } }).then(function (modal) { modal.element.modal(); modal.close.then(function (res) { if(res.data != 'cancel'){ if(!res.data.id){ create(res) }else{ update(res) } } }); }); }
用Karma测试这个的正确方法是什么?这是我到目前为止所拥有的:
在我的beforeEach中:
this.ModalService = { showModal: function(obj) { var deferred = $q.defer(); deferred.resolve({ element: { modal: jasmine.createSpy(),close: function() { var deferred2 = $q.defer(); return deferred2.promise; } } }); return deferred.promise; } }; this.UserService = { user: { id: 2 },updateCategory: function(data,type) { var deferred = $q.defer(); deferred.resolve({ data: { rows: 'response' } }); return deferred.promise; } } this.controller = $controller('ProfileAdditionalController',{ '$scope': this.scope,'$rootScope': this.rootScope,'$state': this.state,"$stateParams": this.stateParams,'ModalService': this.ModalService,'UserService': this.UserService,'ResourceService': this.ResourceService,'$upload': this.upload,'userData': this.userData });
对于我的实际测试:
it('should open a modal when requested',function() { this.scope.openModal(); expect(this.ModalService.showModal) });
但这并没有多大意义.思考?
解决方法
要在控制器上测试openModal函数,基本上您要验证以下内容(3个测试)
>使用一些特定选项调用ModalService.showModal
>一旦显示模态,验证then函数正在执行它想要做的事情
>当模态关闭时,验证第二个函数是否正在执行它想要做的事情
首先,您可能需要在ModelService.showModal上设置间谍(模拟):
spyOn(ModalService,’showModal).and.returnValue($q.when(mockModal))
现在在你的测试中,你将触发函数和$scope.$digest调用:
$scope.openModal(data); $scope.$digest() // to propagate the `resolve()` result of the promise)
这将触发第一个然后回调,(将mockModal作为参数传递),然后您可以验证其行为.
类似于验证第二个回调,您需要模拟已解析的模态对象.