如何从量角器测试中发出POST请求?

时间:2014-02-10 22:18:31

标签: javascript angularjs rest testing protractor

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

4 个答案:

答案 0 :(得分:6)

如果您只想填充数据库,可以使用其他库来运行POST请求。

例如,您可以在beforeEach中使用superagent,例如:

var request = require( "superagent" );

describe( "Something", function() {

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

} );

答案 1 :(得分:5)

在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)
)

答案 2 :(得分:3)

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

onPrepare: function() {

  flow = protractor.promise.controlFlow()

  flow.await(setup_data({data: 'test'})).then( function(result) {
    console.log(result);
  })

}

**从准备器1.1.0开始,prepare可以返回一个promise,因此使用flow来明确地等待解析的承诺是不必要的。

请参阅:https://github.com/angular/protractor/blob/master/CHANGELOG.md

答案 3 :(得分:0)

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

import 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();