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

时间:2015-03-18 14:12:22

标签: javascript angularjs unit-testing protractor angularjs-e2e

我正在使用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中向浏览器发送该函数的序列化版本,而不是在与Web相同的过程中运行测试页面,所以我无法在测试和浏览器之间共享状态(附带问题:这是正确的吗?)。

1 个答案:

答案 0 :(得分:0)

在期待(...)...

之前需要

$httpBackend.flush()