如何在不刷新页面的情况下使用$ httpBackend(e2e),即不使用browser.get

时间:2015-12-17 15:06:24

标签: angularjs selenium protractor

我使用Protractor和ngMockE2E来模拟api响应。如果我使用browser.get导航到下一页,它工作正常。返回预期的模拟数据,但是当我使用搜索按钮上的click()导航到下一页时,$ httpBackend不会获取GET并返回实时数据。

我需要它在按钮单击时返回模拟数据,因为应用程序在应用程序加载时启动会话。 Browser.get导致页面刷新,因此虽然返回了模拟数据,但也会创建一个新会话,而不是在实时环境中发生的会话。

按钮点击后$ httpBackend可以调用whenGET吗?

我正在使用TypeScript编写代码,并为使用ngMockE2E的mock模块编写http-backend-proxy

//httpBackEndMocks.ts
var HttpBackend = require('http-backend-proxy');

var proxy = new HttpBackend(browser);

export class HttpBackendMocks {

    /**
     * Builds a mock module passing any number of the responses below
     */
    buildMockModule = (funcs: Function[]) => {
        if (Array.isArray(funcs)) {
            for (var arrayIndex in funcs) {
                funcs[arrayIndex];
            }
        }
        /** Allow all other GET requests to pass through e.g. html pages */
        proxy.onLoad.whenGET(/.*/).passThrough();
    }

    /**
     * ...
     */
    buildSimpleResponse() {
        var response = require('../responses/simple-respsonse.json');
        return proxy.onLoad.whenGET('the request url').respond(response);
    }

    otherResponse() {whenGET...}

    otherResponse() {whenGET...}

    ....

然后我可以要求:

//search.page.spec

var httpBackEndMocks: app.test.HttpBackendMocks = require('../httpBackEndMocks.js');

并加载我需要的响应:

beforeEach:
var responsesToLoad = [
       httpBackEndMocks.buildSimpleResponse(),
       httpBackEndMocks.otherResponse()
        ];
httpBackEndMocks.buildMockModule(responsesToLoad);

当我转到下一页时:

//search.object.page

browser.get('the url ...');

它有效。它返回模拟数据BUT导致页面刷新初始化新会话。

当我转到下一页时:

this.submitButton.click(); //Code to cause button click omitted

它在没有页面刷新的情况下转换到下一页,因此在同一会话中返回实时数据。

1 个答案:

答案 0 :(得分:0)

我自己为有类似问题的人找到了解决方案:

在量角器启动应用程序之前,应添加具有任何所需响应的模拟模块。这样一旦调用初始的browser.get(...)来加载主页,所有的whenGET都将被注册。

open(responsesToLoad: any[]): void {
        this.buildMockModuleWithRequiredResponses(responsesToLoad);
        browser.get('/home');
    }