expectHEAD已经有文档说明但没有实现?

7
在我们的内部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问题:

据我所知,这意味着在angular-mocks中真的没有expectHEAD()方法 - 它已经被记录下来,但实际上它还不是稳定版angular的一部分。

最好的解决方法是什么?

请注意,我必须使用angular <= 1.2,因为此应用程序需要在IE8上运行(Angular 1.3 停止支持IE8)。


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

2个回答

5
你可以直接添加这个更改:https://github.com/revolunet/angular.js/commit/b2955dd52725241dd9519baa12fe8ca74659004b 在 angular-mocks.js 的第 1523 行,只需要添加一行即可。
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);

很好,这是一个容易的改变。但是,你认为最好的方法是什么来进行这个改变:分叉angular-mocks并使用分叉?谢谢! - alecxe
分叉它可能是最简单的方法,是的。 - dave
决定接受Joel的答案,但授予您赏金。希望这对您来说是公平的。再次感谢您的帮助! - alecxe

2
与分支和编辑库相反,使用底层方法会更好地实践。
$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200);

你不能使用的另一种方法只是一个快捷方式。与更改库相比,使用这种方法更好、更容易。


谢谢,这对我有用,这绝对是更简单的选择。虽然我不太同意@dave的答案值得负评 - 他仍然尝试着帮助,他的方法仍然是合法的。 - alecxe
是的,那很有道理,我还是相对新手;我取消了我的踩票。 - Joel Jeske
感谢您取消了踩的操作。由于您首先提出了更简单的解决方案,我已经接受了您的答案。我将额外的奖励授予了Dave的额外努力。希望这样对您公平。再次感谢。 - alecxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接