Mocha тесты не могут подключиться к базе данных postgres, используя knex - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь реализовать некоторые интеграционные тесты, используя mocha для функций, которые взаимодействуют с базой данных postgres через knex, в экспресс-приложении nodejs.Функции работают вне mocha - я могу запустить приложение на узле или nodemon, отправлять запросы через Postman, извлекать записи из базы данных, добавлять новые записи и т. Д. Но когда я пытаюсь проверить код с помощью mocha, я получаю ошибки, подобныеследующие для любых функций, которые пытаются получить доступ к базе данных:

 select * from "item" where "user_id" = $1 - relation "item" does not exist

Переменная среды для подключения к базе данных настроена для подключения к нужной базе данных;когда я вручную тестирую приложение, все работает;Я получаю данные из базы данных.

Я включил нижеприведенные фрагменты кода: тестовый скрипт для одного из тестов, который не будет работать, функция, которую я пытаюсь протестироватьи модули, на которые эта функция опирается.

ТЕСТОВЫЙ СКРИПТ

const Item = require('../db/item');
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');

// set up the middleware
chai.use(chaiAsPromised);
var should = require('chai').should() 

describe('Item.getByUser', function() {
  contex`enter code here`t('With valid id', function() {
    const item_id = 1;
    const expectedResult = "Canoe";
    it('should return items', function() {
      return Item
      .getByUser(item_id)
      .then(items => {
        items[0].name.should.equal(expectedResult);
        });    
      });  
    });

SNIPPET ИЗ ФУНКЦИИ ITEM.GETBYUSER:

const knex = require('./connection');

module.exports = {

  getByUser: function(id) {
    return knex('item').where('user_id', id);
  },

SNIPPET ИЗ МОДУЛЯ СОЕДИНЕНИЯ:

require('dotenv-safe').config();
const environment = process.env.NODE_ENV || 'development';
const config = require('../knexfile')[environment];
module.exports = require('knex')(config);

SNIPPET ИЗ МОДУЛЯ KNEXFILE:

module.exports = {

  development: {
    client: 'pg',
    connection: process.env.DATABASE_URL
  },
  production: {
    client: 'pg',
    connection: process.env.DATABASE_URL 
  }

};

Сообщение об ошибке, которое я получаю для вышеупомянутого теста:

1) Item.getByUser
       With valid id
         should return items:
     select * from "item" where "user_id" = $1 - relation "item" does not exist
  error: relation "item" does not exist
      at Connection.parseE (node_modules\pg\lib\connection.js:567:11)
      at Connection.parseMessage (node_modules\pg\lib\connection.js:391:17)
      at Socket.<anonymous> (node_modules\pg\lib\connection.js:129:22)
      at addChunk (_stream_readable.js:284:12)
      at readableAddChunk (_stream_readable.js:265:11)
      at Socket.Readable.push (_stream_readable.js:220:10)
      at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)

1 Ответ

0 голосов
/ 07 июля 2019

Ладно, похоже, что это на самом деле связано с переменной среды для базы данных, и я никак не могу понять. Хотя у меня было соединение с базой данных 'postgres: // localhost / mydatabase', база данных, которая фактически использовалась при тестировании db live, включая перенос и заполнение базы данных с помощью команд knex, была 'postgres: // localhost / username' - база данных с тем же именем, что и владелец «mydatabase». Но я думаю, что тесты mocha пытались соединиться с моей базой данных, которая в тот момент была еще пустой, поскольку миграция и начальное число влияли на имя пользователя базы данных.

Итак, я думаю, что это можно закрыть. Я постараюсь повторить проблему, где я был подключен к неправильной БД; Я не уверен, как это могло произойти, так как я никогда не устанавливал соединение намеренно или какую-либо переменную окружения на 'postgres: //localhost/username'.

...