【问题标题】:Express mongoDB Integration testing for private/secured routesExpress mongoDB 私有/安全路由的集成测试
【发布时间】:2020-12-23 17:39:23
【问题描述】:

我正在尝试为应用程序中的一条快速路由运行集成测试。

路由是受保护的路由,允许用户在用户通过身份验证时创建供应商。

我在向“api/v1/supplier”(受保护的路由)路由发出请求之前尝试登录用户,但在调用登录 API 之前无法登录用户返回 500 错误,登录 API 正在按预期工作单独测试时。

这是我正在尝试的测试。请求帮助!

process.env.NODE_ENV = 'development';

const expect = require('chai').expect;
const request = require('supertest');

const app = require('../../../app.js');
const conn = require('../../../db/index.js');

describe('POST /api/v1/supplier ', () => {
  let token = '';

  before(done => {
    conn
      .connect()
      .then(done())
      .catch(err => done(err));
  });

  after(done => {
    conn
      .close()
      .then(done())
      .catch(err => done(err));
  });

  it('Error, on unauthorized POST Supplier request', done => {
    request(app)
      .post('/api/v1/users/login')
      .send({ email: 'sgrmhdk00@gmail.com', password: '12345678' })
      .end(function(err, res) {
        token = res.body.token;
      });

    request(app)
      .post('/api/v1/supplier')
      .set('Authorization', 'Bearer' + token)
      .send({ supplierID: '1234567' })
      .then(res => {
        const body = res.body;
        expect(body).to.contain.property('status');
        expect(body).to.contain.property('error');
        done();
      })
      .catch(err => done(err));
  });
});

db/index.js

const dotenv = require('dotenv');
const mongoose = require('mongoose');
const DB_URI = 'mongodb://localhost:27017/myapp';

function connect() {
  return new Promise((resolve, reject) => {
    dotenv.config({ path: './config.env' });
    const setDatabase = () => {
      if (process.env.NODE_ENV === 'development') {
        const DB = process.env.DATABASE;
        return DB;
      } else {
        const DB = process.env.DATABASE_PRODUCTION.replace(
          '<PASSWORD>',
          process.env.DATABASE_PASSWORD
        );
        return DB;
      }
    };

    const DB = setDatabase();

    mongoose
      .connect(DB, {
        useNewUrlParser: true,
        useCreateIndex: true,
        useFindAndModify: false
      })
      .then(() => console.log('DB connection successful!'));
  });
}

function close() {
  return mongoose.disconnect();
}

module.exports = { connect, close };

【问题讨论】:

    标签: mongodb express mocha.js chai


    【解决方案1】:

    你需要用token调用你的API,但是这两个调用是异步的,你需要在第一个末尾调用第二个方法:

     it('Error, on unauthorized POST Supplier request', done => {
        request(app)
          .post('/api/v1/users/login')
          .send({ email: 'sgrmhdk00@gmail.com', password: '12345678' })
          .end(function(err, res) {
            if(err){
              done(err)
              return
            }
    
            token = res.body.token;
    
            request(app)
             .post('/api/v1/supplier')
             .set('Authorization', 'Bearer' + token)
             .send({ supplierID: '1234567' })
             .then(res => {
              const body = res.body;
              expect(body).to.contain.property('status');
              expect(body).to.contain.property('error');
              done();
            })
            .catch(err => done(err));
          });
    
        
      });
    

    【讨论】:

    • Hi.No lucky..api 调用登录用户失败
    • 验证环境变量是否正确加载,因为 dotenv 从起始文件的根目录获取 .env 文件
    猜你喜欢
    • 2017-01-25
    • 2020-06-26
    • 2020-03-26
    • 1970-01-01
    • 2012-08-21
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多