代码之家  ›  专栏  ›  技术社区  ›  diplosaurus

在Protractor/E2E测试中访问$http数据(AngularJS)

  •  4
  • diplosaurus  · 技术社区  · 9 年前

    我有很多单元测试进展顺利,我已经开始将Protractor E2E测试添加到我的项目中。我在测试页面上的交互元素时做得很好,但在测试从浏览器发送的某些数据时遇到了问题。

    例如,我想看看单击某个按钮是否会产生 POST 到某个端点。

    我使用以下方法设置量角器:

    /*globals global*/
    module.exports = function() {
        'use strict';
        var chai = require('chai')
        ,   promised = require('chai-as-promised');
    
        global.expect = chai.expect;
    
        chai.use(promised);
    }();
    

    我了解如何使用Protractor进行交互:

    it('send data to the "log" endpoint when clicked', function() {
        var repeater = element.all(by.repeater('finding in data.items'));
    
        repeater.get(0).click().then(function() {
            // $http expectation
        });
    });
    

    然而,我不知道如何设置 $httpBackend 在Protractor中,这样我就可以捕获作为 .click() 事件我需要额外的模块吗?

    在Karma/Mocha中,我会简单地:

    beforeEach(module('exampleApp'));
    
    describe('logging service', function() {
        var $httpPostSpy, LoggingService;
    
        beforeEach(inject(function(_logging_, $http, $httpBackend) {
            $httpPostSpy = sinon.spy($http, 'post');
            LoggingService = _logging_;
            backend = $httpBackend;
            backend.when('POST', '/api/log').respond(200);
        }));
    
        it('should send data to $http.post', function() [
            LoggingService.sendLog({ message: 'logged!'});
            backend.flush();
            expect($httpPostSpy.args[0][1]).to.have.property('message');
        });
    });
    

    但我不知道如何获得参考 $http后端 inject Protractor中的模块。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Chandermani    9 年前

    端到端测试是关于测试代码的,其方式与最终用户的方式类似。因此,验证是否发出远程请求应该根据可见结果进行验证,例如数据加载到div或网格中。

    仍然,如果您想验证远程请求是否发出,可以使用 ngMockE2E 模块,其中包含模拟 $htpBackend 类似于中的 ngMock .

    查看 $httpBackend https://docs.angularjs.org/api/ngMockE2E/service/ $http后端

        2
  •  0
  •   Jim    8 年前

    $httpBackend用于模拟对服务器的假调用。在e2e测试中,您通常希望 事实上 呼叫服务器。需要注意的是,量角器中的大多数元素定位器都会返回 promises .

    这意味着使用此代码,您的测试将知道等待服务器的响应返回,然后断言文本是p标记,是来自服务器的正确数据。

    my-file.spec.js

        'use strict';
    
    describe('The main view', function () {
      var page;
    
      beforeEach(function () {
        browser.get('/index.html');
        page = require('./main.po');
      });
    
      it('should have resultText defined', function () {
          expect(page.resultText).toBeDefined()
      })
    
    
      it('should display some text', function() {
        expect(page.resultText.getText()
          .then())
          .toEqual("data-that-should-be-returned");
      });
    
    
    });
    

    my-file.po.js

    'use strict';
    
    var MainPage = function() {
      this.resultText = element(by.css('.result-text'));
    
    
    };
    
    module.exports = new MainPage();