【问题标题】:AngularJS Protractor E2E - mock httpBackend with absolute URLsAngularJS Protractor E2E - 使用绝对 URL 模拟 httpBackend
【发布时间】:2014-06-27 08:20:02
【问题描述】:

我刚刚开始使用 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 服务/url,而不是模拟的。

我不确定我在这里做错了什么。任何帮助都会很棒。

【问题讨论】:

  • 你的量角器端或应用端的模拟代码在哪里?
  • @gontard - 通过模拟代码,我猜你的意思是 httpbackendMock 定义。所有代码都在'describe'块下的spec javascript文件中` var httpBackendMock = function () { var app = angular.module('httpBackendMock', ['app', 'ngMockE2E']); app.run(function ($httpBackend) {} `
  • 您能否更新您的问题,提供一个更完整的示例。
  • @gontard - 我现在更新了问题。

标签: angularjs protractor


【解决方案1】:

我之前也遇到过同样的问题。在 whenGET() 方法中使用正则表达式,以确保任何其他参数都存在并且您看不到它。

试试:

$httpBackend
.whenGET(/^http:\/\/localhost:9191\/security-module\/user.*$/)
.respond(function(method, url, data, headers) {
   return [200, current_user, {}];
});

您将匹配所有以正则表达式路径开头的 url。然后,您可以更新您的正则表达式以仅在有 username=admin 作为参数时指定。将正则表达式与 $httpBackend 一起使用很痛苦,但此服务仅将参数检查为字符串。

避免每次都写:

/^http:\/\/localhost:9191

您可以在 protractor.conf.js 中指定 baseUrl:

baseUrl: 'http://localhost:9191',

【讨论】:

    【解决方案2】:

    重定向在哪里执行?我认为,它应该是这样的:

    $httpBackend.whenGET('http://localhost:8181/web-module/?username=admin')
    .respond(function(method, url, data, headers) {
        return [200, current_user, {}];
     });
    

    因为如果在服务器端完成重定向,应用程序不知道重定向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      相关资源
      最近更新 更多