【问题标题】:With Supertest, can I create an alternative request with some headers set by default?使用 Supertest,我可以创建一个默认设置一些标头的替代请求吗?
【发布时间】:2014-05-18 18:51:03
【问题描述】:

我正在使用 Supertest 和 Mocha 来测试使用 Node JS 开发的 API。

我想对 API 做很多不同的测试。对于几乎所有这些,我必须再次设置 Authorization 和 Content-Type 标头(因为 API 需要它们进行此测试)。

it('Creation without an email address should fail and return error code 50040', function(done) {
  request
    .post('/mpl/entities')
    .set('Authorization', 'Token 1234567890') //set header for this test
    .set('Content-Type',  'application/json') //set header for this test
    .send({
      firstname: "test"
    })
    .expect('Content-Type', /json/)
    .expect(500)
    .expect(anErrorCode('50040'))
    .end(done);
});

it('Creation with a duplicate email address should fail and return error code 50086', function(done) {
  request
    .post('/mpl/entities')
    .set('Authorization', 'Token 1234567890') //<-- again
    .set('Content-Type',  'application/json') //<-- again, I'm getting tired
    .send({
      email: "a@b.nl"
    })
    .expect('Content-Type', /json/)
    .expect(500)
    .expect(anErrorCode('50086'))
    .end(done);
});

我可以使用默认设置的这些标头创建替代请求吗?

【问题讨论】:

    标签: javascript node.js express mocha.js supertest


    【解决方案1】:

    如果我没记错的话,我可以在 superagent 中传递一个哈希值来设置

    agent.set({key:value,key2:value2})
    

    如果它不适用于 supertest,请告诉我。

    【讨论】:

    • 刚刚尝试过,它适用于 Supertest。谢谢。现在我有一个对象存储在某处var base = {'Authorization': 'Token 1234567890', 'Content-Type': 'application/json'}; 并且每次新测试我都会做.set(base)。这为我节省了多余的代码行。谢谢。希望找到设置默认标题的答案并为我节省更多行。更新:实际上,这已经足够了。接受你的回答。
    • 这适用于超级代理,但不适用于超级测试,例如supertest(app).set(...) 不起作用。有没有办法访问 supertest 背后的代理调用.set() 就可以了?
    【解决方案2】:

    您可以使用通用例程将“默认”标头构建为对象并将它们传递给请求:

    //# file:config.js
    
    var config = { 
      baseUrl: "http://localhost:8080",
      authorization: { "Authorization":"authvalue" }
    }
    
    // Content-Type left out because supertest will use Content-Type json when you use the appropriate method
    
    module.exports = config;
    

    现在在你的 test.js 中:

    //# file:test.js
    
    var request = require("supertest");
    var config = require("./config");
    
    request = request(config.baseUrl+"/api/getTokenValue")
    //code to get token value from request
    
    var commonHeaders = { 
      "authorization":tokenValue,
      "X-Testing-Value":1,
      "X-Common-Header":"value"
    };
    
    describe("testing", function() {
      it.should('present authorization header to server', function(done) {
        request.get('/someurl')
          .set(commonHeaders)
          .set({"X-TestSpecificHeader":"Value"})
          .expect(200,done) //if not authorized you'd get 401
      });
      it.should('do something else', function(done) {
        request.get('/someUrl')
          .set(commonHeaders)
          .expect(200,done)
      });
    })
    

    此外,如果您需要让您的应用在运行时(很可能)获取该令牌值,请参阅这篇文章以使用为测试生成的请求令牌值: https://jaketrent.com/post/authenticated-supertest-tests/

    【讨论】:

      【解决方案3】:

      你可以使用库superagent-defaults如下:

      安装

      npm install --save-dev supertest superagent-defaults
      

      用法

      var defaults = require('superagent-defaults');
      var supertest = require('supertest');
      
      var request = defaults(supertest(app)); // or url
      
      // set the default headers
      request.set(commonHeaders);
      
      // use as usually
      

      版本

      • 超测 v3.0.0
      • superagent-defaults v0.1.14

      【讨论】:

        【解决方案4】:

        我以前做的事情是这样的

        首先我创建一个配置文件来存储默认标头,

        配置文件:

        //# file: defaults.js
        var defaults = { 
          l5dDtab: "SomeValue",
          xSignature: true,
          ... more headers here
        }
        module.exports = defaults;
        

        然后,在我使用 supertest 的每个测试文件上,我都会这样做:

        var defaults = require('./defaults.js');
        var supertest = require('supertest');
        
        var host = 'http://localhost:8080';
        var request = supertest.agent(host)
                    .set("l5d-dtab", defaults.l5dDtab)
                    .set("X-Signature", defaults.xSignature);
        var response = request.get("SomePath").set("AnotherLocalHeader", "Value");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-05
          • 2017-12-02
          • 2017-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          • 2011-08-12
          相关资源
          最近更新 更多