0

单击按钮时,我会进行 jsonp 调用。

    function clickHandler(e) {
            e.preventDefault();
            var url = "some.url.with?params";
            $http.jsonp(url).success(function () {$scope.success();})
                            .error(function () {$scope.failure();});
        }

测试:

$httpBackend.expectJSONP(this.url + '&' + $.param(this.params)).respond({status: 200});

$('button').click();

$rootScope.$digest(); // this was suggested in few answers, doesn't work for me though

$httpBackend.flush();

但我不断收到No pending requests to flush failure

在 JSONP 调用的情况下,我们需要做些什么不同的事情。在其他任何地方,这种格式都有效。

PS:是的,我打电话(很多问题,人们实际上是在打电话或触发触发事件的动作)。至少,我看到代码到达了我在代码中提出请求的那一行。

4

2 回答 2

0

我的测试受到套件中早期测试的影响,因此从早期测试中提取的值与我所断言的不同。因此请求不匹配。纠正了他们。现在工作。抱歉,添麻烦了。

于 2015-08-22T11:43:23.697 回答
0

这不起作用,因为它看起来不像您button在测试中创建了 DOM 元素。如果您只调用$scope对象上的函数,您可以轻松地在测试中访问该函数,因为您已经创建了它。尝试这个:

演示

控制器

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $http) {

  $scope.success = function(){
    console.log('success');
  };

  $scope.failure = function(){
    console.log('failure');
  };

  $scope.clickHandler = function(e) {
      e.preventDefault();
      var url = "some.url.with?params";
      $http
        .jsonp(url)
        .success($scope.success)
        .error($scope.failure);
  }

});

规格

describe('Testing a controller', function() {

  var $scope, ctrl, $httpBackend, mockEvent;

  beforeEach(module('plunker'));

  beforeEach(inject(function($rootScope, $controller, _$httpBackend_){

    $scope        = $rootScope.$new();
    $httpBackend  = _$httpBackend_;

    mockEvent = { preventDefault: function(){} };

    ctrl = $controller('MainCtrl', {
      $scope: $scope
    });

  })); 

  it('should trigger success callback', function() {

    spyOn($scope, 'success');

    $httpBackend.expectJSONP('some.url.with?params').respond({status: 200});

    $scope.clickHandler(mockEvent);

    $scope.$digest();

    $httpBackend.flush();

    expect($scope.success).toHaveBeenCalled();

  });

});
于 2015-08-22T09:47:36.933 回答