针对私有/安全路由的 Express mongoDB 集成测试

问题描述

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

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

我在向“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 };

解决方法

你需要用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));
      });

    
  });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...