2016-07-05 35 views
4

我的代码是:我如何测试一个被Karma嘲笑的承诺?

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

什么是与噶对此进行测试的正确方法?这是我到目前为止有:

在我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) 
    }); 

但是,这并不让一大堆的道理。思考?

+2

你有没有'openModal'返回'showModal'使用的诺言。我最近正在测试一个GUI小部件,其功能类似于您的代码所做的事情:方法A调用方法B,并且B返回A正在使用的承诺。我只是决定让A回报它从B(+处理程序)得到的承诺。它大大简化了测试。 – Louis

回答

1

到控制器上测试openModal功能,基本上你想验证以下(3次试验)

  1. ModalService.showModal被称为与一些特定的选项
  2. 一旦显示模式,验证then功能正在做它应该做的事
  3. 当模式关闭时,请验证第二个then函数正在做它应该做的事

首先,你可能需要建立在ModelService.showModal间谍(模拟): spyOn(ModalService, 'showModal).and.returnValue($q.when(mockModal))

现在,在您的测试,你会触发功能和$范围$消化电话:

$scope.openModal(data); 
$scope.$digest() // to propagate the `resolve()` result of the promise) 

这会触发第一个then回调(将mockModal作为参数传递),然后您可以验证其行为。

类似于验证第二个回调,您需要模拟已解析的modal对象。