【问题标题】:Converting Mocha api test from async await to Supertest将 Mocha api 测试从异步等待转换为 Supertest
【发布时间】:2018-09-04 12:31:50
【问题描述】:

我有以下问题,我开始编写 API 测试,现在它看起来像:

  xit('should add address ', async () => {
    const result = await request({
      headers: Object.assign(config.headers, { 'Authorization': 'Bearer '+auth_token }),
      url: `${config.url}/rest/v1/address/`,
      method: "POST",
      json: {
        "name": generatedAddressName,
        "city": "WARSZAWA",
        "street": "UL. KASPROWICZA",
        "houseNumber": "49XX",
        "apartNumber": "",
        "lat": 52.176903,
        "lng": 21.028369,
        "zipCode": "02-732",
        "isDefault": false,
        "inDeliveryZone": true
      }
    });
  });

现在我正在阅读有关 Supertest 库的信息,Supertest 下的测试看起来更具可读性,我想将我的测试用例转换为 Supertest 我试过这样做,但没有任何效果,现在我有:

  it('should add address supertest', function(done) {
    request
      .post('/rest/v1/address/')
      .set(config.headers)
      //.set('Accept', 'application/json')
      .set('Authorization', 'Bearer ' + auth_token)    
      .send({
        "name": generatedAddressName,
        "city": "WARSZAWA",
        "street": "UL. KASPROWICZA",
        "houseNumber": "51",
        "apartNumber": "",
        "lat": 52.176903,
        "lng": 21.028369,
        "zipCode": "02-732",
        "isDefault": false,
        "inDeliveryZone": true
      })
      .expect(200)
      .end(function(err,res){
        done(err);
      });       
   });

我有“TypeError:request.post 不是函数” 你能帮我转换到 Supertest 吗? 同时我还想使用 async/await

【问题讨论】:

    标签: javascript api testing mocha.js supertest


    【解决方案1】:

    不确定这是否可行,但应该是:

    it('should add address supertest', async function(done) {
     const res = await request
      .post('/rest/v1/address/')
      .set(config.headers)
      //.set('Accept', 'application/json')
      .set('Authorization', 'Bearer ' + auth_token)    
      .send({
        "name": generatedAddressName,
        "city": "WARSZAWA",
        "street": "UL. KASPROWICZA",
        "houseNumber": "51",
        "apartNumber": "",
        "lat": 52.176903,
        "lng": 21.028369,
        "zipCode": "02-732",
        "isDefault": false,
        "inDeliveryZone": true
      })
      .expect(200)
      .catch(done)   
     done()
    });  
    

    https://github.com/visionmedia/supertest 中有一个部分讨论了承诺。

    【讨论】:

    • 您甚至可以去掉函数底部的done() 并返回请求。不确定...
    【解决方案2】:

    好的,关于您的错误:您需要导入您的应用并将其作为参数传递给请求,如下所示:

    request(app).post(...
    

    现在关于异步等待:这就是您的代码应该是什么样子

    it('should add address supertest', async () => {
      const res = await request(app)
        .post('/rest/v1/address/')
        .set(config.headers)
        //.set('Accept', 'application/json')
        .set('Authorization', 'Bearer ' + auth_token)    
        .send({
          "name": generatedAddressName,
          "city": "WARSZAWA",
          "street": "UL. KASPROWICZA",
          "houseNumber": "51",
          "apartNumber": "",
          "lat": 52.176903,
          "lng": 21.028369,
          "zipCode": "02-732",
          "isDefault": false,
          "inDeliveryZone": true
        })
    
      expect(res.statusCode).to.equal(200);
    });
    

    编辑:在超测文档中注意这一点

    Blockquote 您可以将 http.Server 或函数传递给 request() - 如果服务器尚未侦听连接,则它会为您绑定到临时端口,因此无需跟踪端口。

    我不认为将 URL 传递给 request() 会起作用

    【讨论】:

    • 如果我测试 web 服务,而不是本地应用程序 - 我应该将 url 放在哪里服务?
    • 在同一个地方。
    • 好的,现在我有:const res = await request(url) under 'it' and above:' const request = require('supertest')(url);'还是有'TypeError: request.post is not a function,怎么回事?
    • 正确的是:const request = require('supertest'); 然后是const res = await request(url).post....。另外,请注意我的答案的编辑
    • 在下面查看我的最新评论
    【解决方案3】:

    @iagowp 我在你的例子中写了代码,它把我扔了

      1) 0_auth
           should return token for unauthorized user:
         Error: incorrect header check
          at Unzip.zlibOnError (zlib.js:153:15)
    

    const chai = require('chai');
    //const request = require('request-promise-native');
    const mocha = require('mocha');
    const config = require('../config');
    const request = require('supertest');
    const assert = chai.assert;
    auth_token = '';
    
    
    describe('0_auth', () => {
        it('should return token for unauthorized user', async () => {
        const res = await request(url)
          .post('/rest/v1/auth/get-token')
          .set(config.headers)
          //.set('Accept', 'application/json')  
          .send({
              "deviceUuidSource": "DEVICE",
              "source" : "KIOSK_KFC",
              "deviceUuid" : "uniquedeviceuuid"
          })
          .end(function(err,res){
            assert.equal(res.status,200)
            assert.property(res.body, 'token')
            assert.isString(res.body.token)
            auth_token=res.body.token
            console.log('unathorized token: '+auth_token) 
            done(err);
          });    
          expect(res.statusCode).to.equal(200);   
       });
    
    
       it('should return token for authorized user', async () => {
        const res = await request(url)
          .post('/rest/v1/auth/with-password')
          .set(config.headers)
          .set('Authorization', 'Bearer ' + auth_token) 
          //.set('Accept', 'application/json')  
          .send({
            "email" : user,
            "password" : password
          })
          .end(function(err,res){
            assert.equal(res.status,200)
            assert.property(res.body,'token')
            assert.isString(res.body.token)
            assert.equal(res.body.user.email,user)
            assert.isFalse(res.body.user.locked)
            auth_token=res.body.token
            console.log('authorized token: '+auth_token) 
            done(err)
          });  
          expect(res.statusCode).to.equal(200);       
       });
    
    });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 2021-10-03
      • 1970-01-01
      • 2018-02-13
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      相关资源
      最近更新 更多