Javascript 单元测试:在模拟承诺返回以测试我的发射时遇到问题
单元测试:在模拟承诺返回以测试我的发射时遇到问题 我想看看是否在promise回调中调用了emit 这是我正在测试的代码:Javascript 单元测试:在模拟承诺返回以测试我的发射时遇到问题,javascript,angularjs,unit-testing,sinon,Javascript,Angularjs,Unit Testing,Sinon,单元测试:在模拟承诺返回以测试我的发射时遇到问题 我想看看是否在promise回调中调用了emit 这是我正在测试的代码: "use strict"; angular.module("app.directives") .directive("modalFilter", ["filterValidationService", function(filterValidationService) { return { restrict: "E",
"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);
});
});
这是我的单元测试:
"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);
});
});
“严格使用”;
描述(“模态滤波器组件:”,函数(){
var元素;
var范围;
var mockData={“size”:{“to”:0,“from”:0};
var mockfilteredata={“size”:{“to”:900,“from”:100};
var filterValidationService;
之前(angular.mock.module(“例如insight.services”);
在每个之前(angular.mock.module(“例如insight.Directions”);
beforeach(注入函数($compile,$injector,$q,$rootScope,filterValidationService){
var deferred=$q.deferred();
scope=$rootScope.$new();
scope.filter=mockData;
filterValidationService=filterValidationService;
元素=”;
元素=$compile(元素)(范围);
元素(document.body).append(element);
范围。$digest();
scope=element.isolateScope();
sinon.spy(范围,“$emit”);
sinon.存根(filterValidationService,“validateSize”).返回(延迟.承诺);
}));
它(“调用updateTable时应为过滤数据发出”,函数(){
scope.updateTable();
expect(scope.$emit.calledWith(“filter:cardData”,mockData.size,“availabilities”,false)).toEqual(true);
});
});
我正在使用angular1进行jasmine单元测试和sinon
我得到的错误是:“预期false等于true”我想这可能是因为您在返回一个承诺
sinon.stub(filterValidationService,“validateSize”).returns(deferred.promise)代码>
但是您永远不会解决承诺,因此永远不会调用。然后()
可能在变量中保留承诺,并在it()
方法中的scope.UpdateTable()
之后解析它。是否类似于:deferred.resolved(mockData.size);方法名为resolve
,您可能需要考虑在it()
方法中添加deferred.promise.finally()
,然后在该方法中执行expect()
。