我正在尝试使用mocha进行一些集成测试,以实现在nodejs express应用程序中通过knex与postgres数据库进行交互的功能。 这些功能在mocha之外起作用-我可以在node或nodemon中启动应用程序,通过Postman提交请求,从数据库中检索记录,添加新记录,等等。但是当我尝试通过mocha测试代码时,会出现类似对于尝试访问数据库的所有功能,请执行以下操作:
select * from "item" where "user_id" = $1 - relation "item" does not exist
数据库连接的环境变量设置为连接到正确的数据库;当我端到端手动测试应用程序时,一切正常;我从数据库取回数据。
我在下面列出了我认为是相关的代码段:无法进行其中一项测试的测试脚本,我要测试的功能以及该功能所依赖的模块。 / p>
测试脚本
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);
});
});
});
来自ITEM.GETBYUSER功能的片段:
const knex = require('./connection');
module.exports = {
getByUser: function(id) {
return knex('item').where('user_id', id);
},
连接模块中的片段:
require('dotenv-safe').config();
const environment = process.env.NODE_ENV || 'development';
const config = require('../knexfile')[environment];
module.exports = require('knex')(config);
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)
答案 0 :(得分:0)
好吧,看来这实际上与我无法弄清楚的某种方式与数据库的环境变量有关。尽管我已将数据库连接设置为“ postgres:// localhost / mydatabase”,但当我实时测试数据库时(包括通过knex命令迁移和播种数据库)实际使用的数据库是“ postgres:// localhost / username”-与“ mydatabase”的所有者同名的数据库。但是我认为mocha测试正在尝试连接到mydatabase,当时mydatabase仍然是空的,因为迁移和种子影响了数据库的“用户名”。
所以,我认为这可以关闭。我将尝试复制连接到错误数据库的问题;不知道怎么回事,因为我从来没有故意设置连接或任何环境变量为'postgres:// localhost / username'。