我使用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
它在没有页面刷新的情况下转换到下一页,因此在同一会话中返回实时数据。
答案 0 :(得分:0)
我自己为有类似问题的人找到了解决方案:
在量角器启动应用程序之前,应添加具有任何所需响应的模拟模块。这样一旦调用初始的browser.get(...)来加载主页,所有的whenGET都将被注册。
open(responsesToLoad: any[]): void {
this.buildMockModuleWithRequiredResponses(responsesToLoad);
browser.get('/home');
}