$httpBackend: Angular 发送 GET 请求的单元测试

$httpBackend: Angular Unit-Testing that a GET request is sent

我想测试(组件的)控制器是否正在向某些 URL 发送 GET 请求(不关心响应)。我期待

httpBackend.expectGET('/some/random/url');

会监视 http 后端并在未收到 GET 请求时失败,因此我预计以下规范会失败:

describe('myApp', function() {
  var httpBackend;

  beforeEach(module('myApp'));

  beforeEach(inject(function($httpBackend) {
    httpBackend = $httpBackend;
  }));

  it('sends a GET request to /some/random/url', function() {
    httpBackend.expectGET('/some/random/url');
    httpBackend.expect('GET', '/some/random/url');
  });

});

但这似乎平淡无奇

Starting the Teaspoon server...
Teaspoon running default suite at http://127.0.0.1:56255/teaspoon/default
..

Finished in 0.01200 seconds
2 examples, 0 failures

有了这个:

angular.module('myApp', []);

所以我想我误解了 expectGET 在做什么,这不是检查我要检查的内容的方法。

您忘记在 httpBackend 上调用 flush()。届时它将检查是否已收到所有预期的请求。

我通常将以下代码添加到任何处理 http 模拟的规范(测试)文件中。这确保调用被刷新并且没有未完成的期望/请求。

afterEach(() => {
    try {
        $httpBackend.flush();
    } catch (e) {
    } 
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});

这会像这样更改您的代码

describe('myApp', function() {
  var httpBackend;

  beforeEach(module('myApp'));

  beforeEach(inject(function($httpBackend) {
    httpBackend = $httpBackend;
  }));

  afterEach(() => {
      try {
          httpBackend.flush();
      } catch (e) { // entering here is a sign your unit test failed
      } 
      httpBackend.verifyNoOutstandingExpectation();
      httpBackend.verifyNoOutstandingRequest();
  });

  it('sends a GET request to /some/random/url', function() {
    httpBackend.expectGET('/some/random/url');
    httpBackend.expect('GET', '/some/random/url');
  });

});