我刚开始使用Protractor为angularJS应用程序进行E2E UI测试。
该应用的基本网址类似于 -
http://localhost:8181/web-module/?username=admin
然后,此URL会重定向到实际应用程序中用于给定用户名的安全模块。安全模块正在另一个端口上运行 - 9191。
重定向的请求看起来像 -
http://localhost:9191/security-module/user/?username=admin
当我尝试使用 $ httpBackend 使用 -
模拟此请求时 describe('Home Page', function () {
var ptor = protractor.getInstance();
var httpBackendMock = function () {
var app = angular.module('httpBackendMock', ['ngMockE2E']);
app.run(function ($httpBackend) {
var current_user = {"username":"admin","password":null,"fullName":"System Admin","email":"admin@example.com"};
$httpBackend.whenGET('http://localhost:9191/security-module/user/?username=admin').respond(function(method, url, data, headers) {
return [200, current_user, {}];
});
$httpBackend.whenGET(/.*/).passThrough();
})
};
ptor.addMockModule('httpBackendMock', httpBackendMock);
it('home page', function () {
ptor.get('http://localhost:8181/web-module/?username=admin');
var element = ptor.findElement(protractor.By.id('username'));
expect(element.getText()).toEqual('System Admin');
});
});
GET调用仍尝试点击实际的http服务/网址,而不是模拟的网站。
我不确定我在这里做错了什么。任何帮助都会很棒。
答案 0 :(得分:2)
之前我遇到过同样的问题。在你的whenGET()方法中使用正则表达式来确保任何其他参数都存在并且你没有看到它。
尝试:
$httpBackend
.whenGET(/^http:\/\/localhost:9191\/security-module\/user.*$/)
.respond(function(method, url, data, headers) {
return [200, current_user, {}];
});
您将匹配以正则表达式路径开头的所有网址。然后,您可以更新正则表达式,以便仅在 username = admin 作为参数时指定。使用带有$ httpBackend的正则表达式很痛苦但这个服务只将参数检查为字符串。
为避免每次写作:
/^http:\/\/localhost:9191
您可以在protractor.conf.js中指定baseUrl:
baseUrl: 'http://localhost:9191',
答案 1 :(得分:0)
执行重定向的位置?我想,它看起来应该是这样的:
$httpBackend.whenGET('http://localhost:8181/web-module/?username=admin')
.respond(function(method, url, data, headers) {
return [200, current_user, {}];
});
因为如果在服务器端完成重定向,应用程序不知道重定向。