Jasmine:当存在多个具有不同参数的调用时,如何添加方法的期望

时间:2018-04-02 17:07:07

标签: angularjs jasmine

我有一种情况需要调用服务以使用请求参数获取实体块。 e.g。

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

它使用不同的参数调用$scope.printParams

it('should invoke printParams multiple times', function() {
  spyOn($scope, 'printParams');
  $scope.invokeMultipleTimes();
  expect($scope.printParams).toHaveBeenCalledWith([ 1, 2 ], [ 3, 4 ], [ 5, 6]);
});

以下是示例测试用例,但是说: 使用[[1,2],[3,4],[5,6]]调用预期的间谍printParams,但实际调用是[[1,2]],[[3,4]], [[5,6]]。

Plunker example

1 个答案:

答案 0 :(得分:1)

基本问题是[1,2] !== [1,2],因为它们是不同的对象。

要解决这个茉莉花有jasmine.objectContaining,它可以测试类似的对象,包括数组

将期望改为

expect($ scope.printParams).toHaveBeenCalledWith(jasmine.objectContaining([1,2]));   expect($ scope.printParams).toHaveBeenCalledWith(jasmine.objectContaining([3,4]));   expect($ scope.printParams).toHaveBeenCalledWith(jasmine.objectContaining([5,6]));

作品

https://plnkr.co/edit/KJ3bkFkSUyYl0SbZSRFf?p=preview