7

在我们内部的 angularjs 项目中,其中一项服务$http.head()调用了我正在尝试测试的调用。

为了测试,我使用angular-mocks. 以下是相关代码:

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()方法 - 它已记录在案,但实际上,它还不是稳定角度发布的一部分。

最好的方法是什么?

请注意,我必须使用 angular <= 1.2,因为这个应用程序需要在 IE8 上运行(Angular 1.3 正在放弃对 IE8 的支持)。


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

4

2 回答 2

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);
于 2014-09-25T02:07:28.153 回答
2

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

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

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

于 2014-10-01T03:04:42.317 回答