【问题标题】:How can I make a POST request from a Protractor test?如何从量角器测试发出 POST 请求?
【发布时间】:2014-03-08 11:39:22
【问题描述】:

我想在运行Protractor 测试之前向数据库服务器发出 POST 请求(带有 JSON 有效负载),以便注入测试数据。如果可能的话,我该怎么做?

【问题讨论】:

标签: javascript angularjs rest testing protractor


【解决方案1】:

如果您只想填充数据库,则可以使用另一个库来运行 POST 请求。

例如,您可以像这样在beforeEach 中使用superagent

var request = require( "superagent" );

describe( "Something", function() {

  beforeEach( function( done ) {
    request
      .post( "http://localhost/api/foo" )
      .send( {data : "something"} )
      .end( done );
  } );

} );

【讨论】:

    【解决方案2】:

    在 Andres D 的帮助下,我找到了一种方法。它的要点是通过browser.executeAsyncScript 在浏览器中运行一个脚本,并在其中注入$http service。然后告诉 $http 服务发出 POST 请求。这是如何完成的示例 CoffeeScript:

    browser.get('http://your-angular-app.com')
    browser.executeAsyncScript((callback) ->
      $http = angular.injector(["ng"]).get("$http")
      $http(
        url: "http://yourservice.com"
        method: "post"
        data: yourData
        dataType: "json"
      )
      .success(->
        callback([true])
      ).error((data, status) ->
        callback([false, data, status])
      )
    )
    .then((data) ->
      [success, response] = data
      if success
        console.log("Browser async finished without errors")
      else
        console.log("Browser async finished with errors", response)
    )
    

    【讨论】:

    • 第三行的这个角度从何而来?我有未定义的角度。
    • @Ricbermo 我面前没有代码,但它是Angular's global API 的一部分。 IIRC 该函数在已加载页面的上下文中执行(例如,http://your-angular-app.com),该页面必须已加载 Angular。
    【解决方案3】:

    可以在量角器配置的 onPrepare 函数中运行一些异步设置代码。您需要明确告诉量角器等待您的请求完成。这可以通过 flow.await() 来完成,它与 Promise 配合得很好。

    onPrepare: function() {
    
      flow = protractor.promise.controlFlow()
    
      flow.await(setup_data({data: 'test'})).then( function(result) {
        console.log(result);
      })
    
    }
    

    ** 从 protractor 1.1.0 开始,prepare 可以返回一个 Promise,因此使用 flow 来显式等待 Promise 解决是不必要的。

    见:https://github.com/angular/protractor/blob/master/CHANGELOG.md

    【讨论】:

    • 不熟悉 onPrepare,但它会为整个套件运行一次吗?我真的需要每个测试设置/拆卸方法。
    • 是的,它在运行任何测试之前运行一次。听起来 onPrepare 不会做你想做的事。
    • flow.await 似乎也适用于 itbeforeEach 函数;我认为onPrepare 没有限制。
    • 如果我遗漏了什么,请原谅我,但await 不期待承诺吗? Protractor 允许你从onPrepare 函数返回一个承诺,所以你可以只做return setup_data({data: 'test'});
    • 这是在 Protractor 1.1.0 之前编写的,在 onPrepare 允许您返回承诺之前。确实可以简化。
    【解决方案4】:

    从量角器发出 POST 请求的另一种方法是使用“http”

    const http = require('http');
    
       const data = yourData; 
       const options = {
            port: portnumber,
            hostname: hostname,  // without http
            path: '/api/path/',
            method: 'POST',
            headers: {
                "content-type": "application/json"                
            }
        };
    
        const request = http.request(options, function (result) {
            var body = '';
    
            result.on("data", function (chunk) {
                body = body + chunk;
            });
    
            result.on("end", function () {
              console.log(body);
            });
        });
    
        request.write(JSON.stringify(data));
        request.end(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2018-11-10
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多