expectHEAD有记录但没有实现?

时间:2014-09-19 17:49:03

标签: javascript angularjs http angularjs-http http-head

在我们的内部angularjs项目中,其中一项服务有$http.head()电话,我试图测试。

为了进行测试,我使用angular-mocks提供的Fake HTTP backend。以下是相关代码:

it('handle status code 200', inject(function ($httpBackend, ConnectionService) {
    spyOn(Math, 'random').andReturn(0.1234);

    httpBackend = $httpBackend;
    httpBackend.expectHEAD('ping?rand=1234').respond(200);
    ConnectionService.sendRequest();
    httpBackend.flush();

    expect(ConnectionService.stats.packetsReceived).toEqual(5);

    httpBackend.verifyNoOutstandingExpectation();
    httpBackend.verifyNoOutstandingRequest();
}));

将测试结果运行到以下错误:

PhantomJS 1.9.7 (Mac OS X) connection service tests sendRequest function handle status code 200 
FAILED  TypeError: 'undefined' is not a function (evaluating 'httpBackend.expectHEAD('ping?rand=1234')')
at /path/to/app/app-connection-service_test.js:66
at d (/path/to/app/bower_components/angular/angular.min.js:35)
at workFn (/path/to/app/bower_components/angular-mocks/angular-mocks.js:2159)

经过深入挖掘后,我发现了相关的github问题:

据我所知,这意味着角度模拟中确实没有expectHEAD()方法 - 它已被记录,但实际上,它还不是稳定角度释放的一部分。 / p>

最好的方法是什么?

请注意,我必须使用angular< = 1.2,因为此应用需要在IE8上运行(Angular 1.3为dropping support for IE8)。


我目前正在考虑的一个解决方法是将head()替换为get()。在这种情况下,我可以使用现有的expectGET()方法对其进行测试。但我不确定这些缺点。

2 个答案:

答案 0 :(得分:5)

您可以自己添加更改:https://github.com/revolunet/angular.js/commit/b2955dd52725241dd9519baa12fe8ca74659004b

这是1523行的angular-mocks.js中的一行更改:

1523: -    angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) {
1523: +    angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {    

看到你必须继续使用非当前版本的Angular,它不会在将来引起太多问题。

编辑:回顾JoelJeske的回答,他提出了一个很好的观点 - 你可以轻松地做到这一点而不用分叉。我要对他的解决方案做出的一个改变是,而不是直接调用方法

$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200);

我会直接创建快捷方法:

$httpBackend.expectHEAD = function(url, headers) {
    return $httpBackend.expect('HEAD', url, undefined, headers);
};

然后你可以这样做:

$httpBackend.expectHEAD('ping?rand=1234').respond(200);

答案 1 :(得分:2)

与分叉和编辑库相反,使用底层方法会更好。

$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200);

您不能使用的另一种方法只是一种快捷方法。使用此方法比更改库更好,更容易。