Jasmine:如何为多次不同参数调用的方法添加断言
如何用Jasmine测试方法的多次不同参数调用?
假设你有这样一段AngularJS控制器代码,它会把参数数组分块,多次调用printParams方法:
app.controller('MainController', function($scope, $timeout) { var chunkSize = 2, params = [1,2,3,4,5,6]; $scope.invokeMultipleTimes = function () { for (var i = 0; i < params.length; i += chunkSize) { $scope.printParams(params.slice(i, i+chunkSize)) } } $scope.printParams = function (p) { //doSomething } });
要测试invokeMultipleTimes是否正确按分块参数调用printParams,咱们可以用Jasmine的**spy(间谍)**功能来跟踪方法的调用情况,具体步骤如下:
步骤1:搭建测试环境
首先在测试用例中注入AngularJS的$controller和$rootScope服务,用来实例化控制器并创建作用域。
步骤2:创建Spy监视目标方法
用spyOn()在作用域上创建间谍,替换原有的printParams方法,这样就能捕获它的所有调用细节,同时不会执行原方法的业务逻辑。
步骤3:触发待测试方法并添加断言
调用invokeMultipleTimes后,咱们可以通过spy的API来验证调用次数和每次的参数是否符合预期。
完整测试用例示例
describe('MainController', function() { var $scope; beforeEach(module('yourAppName')); // 替换成你的AngularJS应用模块名 beforeEach(inject(function($controller, $rootScope) { $scope = $rootScope.$new(); // 实例化控制器,传入创建好的scope $controller('MainController', { $scope: $scope }); // 创建spy,监视printParams方法 spyOn($scope, 'printParams'); })); it('should call printParams with chunked parameters correctly', function() { // 触发待测试的方法 $scope.invokeMultipleTimes(); // 首先验证调用次数:6个参数分2个一组,应该调用3次 expect($scope.printParams).toHaveBeenCalledTimes(3); // 分别验证每次调用的参数 expect($scope.printParams).toHaveBeenCalledWith([1,2]); expect($scope.printParams).toHaveBeenCalledWith([3,4]); expect($scope.printParams).toHaveBeenCalledWith([5,6]); // 或者一次性获取所有调用的参数数组,按顺序逐个验证 var allCallArgs = $scope.printParams.calls.allArgs(); expect(allCallArgs[0]).toEqual([[1,2]]); expect(allCallArgs[1]).toEqual([[3,4]]); expect(allCallArgs[2]).toEqual([[5,6]]); }); });
关键点说明
spyOn($scope, 'printParams')会把原方法替换成间谍函数,既能跟踪调用信息,又不会干扰原方法的逻辑。toHaveBeenCalledTimes(n)用来验证方法被调用的次数是否符合预期。toHaveBeenCalledWith(...)用来验证方法是否以指定参数被调用过(只要调用过一次就会通过);如果要严格验证调用顺序和每一次的参数,用calls.allArgs()获取所有调用的参数列表,再逐个对比会更精准。
内容的提问来源于stack exchange,提问作者Zohaib Jawaid
相关产品推荐
相关产品推荐

