Шутки проходят раньше всех - PullRequest
0 голосов
/ 28 апреля 2018

Сценарий [ОБНОВЛЕНО]

Я пытаюсь подключиться к mongodb перед запуском тестовых случаев, и если я не ошибаюсь, я могу использовать beforeAll, который входит в Jest, где я могу подключиться к своей БД перед запуском тестовых случаев, я также тестирую свой REST API с этим

Test

const request = require ('supertest');
const app = require ('../../app');
const db = require ('../../db.js');
const url = 'mongodb://localhost:27017';

//UPDATED beforeALL (thanks to @andreas-köberle)
beforeAll ((done) => {
    db.connect (url, (err) => {
        if (err) {
            console.log ('Unable to connect',err)
            process.exit(1)
          } else {
            console.log('success')
          }
    });
});


test('should response the GET method', async () => {
    console.log('DADAD');
    const res = await request (app).get ('/expense'); // I've set /expense in app (app.use('/expense,'expenseRoute)
    return expect(res.statusCode).toBe (200);
});

afterAll ( () => {
  db.close ();
});

DB

const MongoClient = require ('mongodb').MongoClient;
const dbName = 'expenseTest';

let state = {
  db: null,
};

exports.connect = (url, done) => {
  if (state.db) return done ();

  MongoClient.connect (url, (err, client) => {
    const db = client.db(dbName);
    state.db = db;
    done ();
  });
};

exports.get = () => {
  return state.db;
};

exports.close = done => {
  if (state.db) {
    state.db.close ((err, res) => {
      state.db = null;
      done (err);
    });
  }
};

ROUTE

const express = require ('express')
const router = express.Router ()

const MongoClient = require ('mongodb').MongoClient
const assert = require ('assert')
let db = require ('../db')

/**
   * Returns the expense
   */
router.get ('/', (req, res) => {

  console.log(db.get());
  let expenseCollection = db.get ().collection ('expenseTrack')

  expenseCollection.find({}).toArray((err, docs) => {    
    res.status(200).send(docs)
  })
  //res.status(200).send('hello')
})

/**
   * Stores the expense in db
   */
router.post ('/', (req, res) => {
  let expenseCollection = db.get ().collection ('expenseTrack')
  expenseCollection.insert (req.body, (err, result) => {
    if (err) console.log (err)
    else res.status (200).send (result.ops)
  })
})

module.exports = router

У меня есть консольные журналы в Test, в моем GET-маршруте и в beforeAll, вот вывод npm run test

● Console

    console.log test/express/startupTest.test.js:18
      DADAD
    console.log routes/Expense.js:13
      null
    console.log test/express/startupTest.test.js:11
      Succesfully

Итак, ясно, что сначала он идет в Test, если я изменю свой код конечной точки на этот, весь тестовый пример работает нормально.

/**
   * Returns the expense
   */
router.get ('/', (req, res) => {

  // console.log(db.get());
  // let expenseCollection = db.get ().collection ('expenseTrack')

  // expenseCollection.find({}).toArray((err, docs) => {    
  //   res.status(200).send(docs)
  // })
  res.status(200).send('hello')
})

После обновления до Все теперь выдает другую ошибку / исключение

 Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
...