如何断言后端端点已被调用

How to assert that a backend endpoint has been called?

本文关键字:端点 调用 后端 何断言 断言      更新时间:2023-09-26

我正在使用Protractor构建Angular应用程序的E2E测试。后端HTTP服务正在使用$httpBackend进行模拟。到目前为止,测试看起来是这样的:

describe('foo', function () {
  it('bar', function () {
    var backendMockModule = function () {
      angular
        .module('backendMock', [])
        .run(['$httpBackend', function ($httpBackend) {
          $httpBackend.whenPUT('http://localhost:8080/services/foo/bar')
            .respond(function (method, url, data, header) {
              return [200, {}, {}];
            });
        }]);
    };
    browser.addMockModule('backendMock', backendMockModule);
    browser.get('http://localhost:8001/#/foo/bar');
    element(by.id('baz')).click();
    // here I would like to assert that the Angular app issued a PUT to '/foo/bar' with data = {...}
  });
});

这个测试比这个稍微详细一点,它测试接口和其他东西的乐观更新。但我认为这和这个问题无关,所以我去掉了其他部分。测试本身运行良好,我能够检查接口上的元素是否如预期。我没有发现的是:

如何断言使用正确的数据、方法、头等调用了后端HTTP端点

我试过这样做(添加hasBeenCalled变量):

describe('foo', function () {
  it('bar', function () {
    var hasBeenCalled = false;
    var backendMockModule = function () {
      angular
        .module('backendMock', [])
        .run(['$httpBackend', function ($httpBackend) {
          $httpBackend.whenPUT('http://localhost:8080/services/foo/bar')
            .respond(function (method, url, data, header) {
              hasBeenCalled = true;
              return [200, {}, {}];
            });
        }]);
    };
    browser.addMockModule('backendMock', backendMockModule);
    browser.get('http://localhost:8001/#/foo/bar');
    element(by.id('baz')).click();
    expect(hasBeenCalled).toBeTruthy();
  });
});

但它不起作用。我不知道Protractor是如何进行测试的,但我想它会在调用addMockModule中将函数的序列化版本发送到浏览器,而不是在与网页相同的过程中运行测试,因此我无法在测试和浏览器之间共享状态(附带问题:这是正确的吗?)。

$httpBackend.flush()在预期(…)…

之前需要