2016-09-26 35 views
1

单元测试:遇到问题嘲讽承诺回报率来测试我的EMIT单元测试:遇到问题嘲讽承诺回报率来测试我的EMIT

我想看看是否EMIT得到的承诺回调调用。

这是我的代码我测试:

"use strict"; 

angular.module("app.directives") 
    .directive("modalFilter", ["filterValidationService", function(filterValidationService) { 
     return { 
      restrict: "E", 
      scope: {}, 
      templateUrl: "templates/components/modal-filter.html", 
      link: function(scope) { 
       let defaultFilter = {"size": {"to": 0, "from": 0}}; 

       scope.clearFilter = function() { 
        scope.filter = defaultFilter; 
       }; 

       //New - requires unit test 
       scope.updateTable = function() { 
        const tab = "availabilities"; 
        const isFilter = scope.filter === defaultFilter ? false : true; 

        filterValidationService.validateSize(scope.filter.size) 
         .then(filterObj => { 
          scope.$emit("filter:cardData", filterObj, tab, isFilter); 
         }); 
       }; 

       scope.clearFilter(); 
      } 
     }; 
}]); 

这是我的单元测试:

"use strict"; 

describe("modal filter component:", function() { 
    var element; 
    var scope; 
    var mockData = {"size": {"to": 0, "from": 0}}; 
    var mockFilteredData = {"size": {"to": 900, "from": 100}}; 
    var filterValidationService; 

    beforeEach(angular.mock.module("eg.insight.services")); 
    beforeEach(angular.mock.module("eg.insight.directives")); 

    beforeEach(inject(function ($compile, $injector, $q, $rootScope, filterValidationService) { 
     var deferred = $q.defer(); 
     scope = $rootScope.$new(); 
     scope.filter = mockData; 
     filterValidationService = filterValidationService; 

     element = "<modal-filter></modal-filter>"; 
     element = $compile(element)(scope); 

     angular.element(document.body).append(element); 

     scope.$digest(); 
     scope = element.isolateScope(); 

     sinon.spy(scope, "$emit"); 

     sinon.stub(filterValidationService, "validateSize").returns(deferred.promise); 
    })); 

    it("should emit for filtered data when updateTable is called", function() { 
     scope.updateTable(); 
     expect(scope.$emit.calledWith("filter:cardData", mockData.size, "availabilities", false)).toEqual(true); 
    }); 
}); 

我使用angular1茉莉单元测试和兴农。

我得到的错误是:“预期虚假等于真正的”

回答

1

我想这可能是因为在这里你会返回一个承诺

sinon.stub(filterValidationService, "validateSize").returns(deferred.promise);

,但你永远解决承诺,所以.then()永远不会被调用。

也许在变量中承诺并在您的it()方法中使用scope.UpdateTable()后解决。

+0

会是这样的:deferred.resolved(mockData.size); – AngularM

+0

方法名称为'resolve' https://docs.angularjs.org/api/ng/service/$q您可能需要考虑在您的it()中添加deferred.promise.finally() '方法,然后你将执行'expect()'。 – Stephen