【发布时间】:2017-06-02 13:16:02
【问题描述】:
我正在尝试使用 Mocha 和我的 Bookshelf / Knex 模型运行一个简单的测试,但是我收到错误“未处理的拒绝错误:SQLITE_ERROR:没有这样的表:用户”。请注意,我正在尝试在内存中使用 SQLite。
这是我的 Knex 文件:
module.exports = {
development: {
client: 'sqlite3',
connection: {
filename: ':memory:'
}
},
test: {
client: 'mysql',
connection: {
host: '172.18.0.2',
user: 'root',
password: '',
database: 'staging_db',
charset : 'utf8'
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'knex_migrations'
}
},
production: {
client: 'mysql',
connection: {
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'usr',
password: process.env.DB_PWD || '',
database: process.env.DB_NAME || 'db',
charset : 'utf8'
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'knex_migrations'
}
}
};
数据库.js:
var config = require('../knexfile.js');
var env = process.env.NODE_ENV || 'development';
var knex = require('knex')(config[env]);
knex.migrate.latest([config]);
let bookshelf = require('bookshelf')(knex);
bookshelf.plugin('registry'); // Resolve circular dependencies with relations
// Export bookshelf for use elsewhere
module.exports = bookshelf;
还有我的用户模型:
let bookshelf = require('../config/database');
require('./role');
var User = bookshelf.Model.extend({
tableName: 'users',
role: function() {
return this.hasOne(Role);
}
});
module.exports = bookshelf.model('user', User);
我的测试:
var User = require('../../models/user'),
chai = require('chai'),
expect = chai.expect;
describe('User model', function () {
it('should return empty set before adding anything', () => {
expect(User.collection().count()).to.equal(0);
});
});
我错过了什么吗?
更新
添加迁移文件:
exports.up = function(knex, Promise) {
return knex.schema.createTable('roles', function (table) {
//this creates an id column as auto incremented primary key
table.increments();
table.string('description', 45).notNullable();
})
.createTable('users', function (table) {
table.increments();
table.string('name', 60);
table.string('password', 45);
table.integer('role_id').unsigned();
table.foreign('role_id').references('roles.id');
});
};
exports.down = function(knex, Promise) {
return knex.schema.dropTable('users').dropTable('roles');
};
【问题讨论】:
-
Bookshelf 和 Knex 都不会自动创建表格。您是否正在创建这个“用户”表(例如,使用 knex Schema Builder)?
-
我已经使用 Knex CLI 创建了一个迁移文件,我已经用这个迁移的代码更新了问题。
-
您通常是直接测试您的模型还是使用测试您的 API 来间接测试模型?
-
我两者都做。我对每个 API 进行了测试,但也测试了模型级别。 API 测试的粒度低于模型测试。因此,如果一个模型暴露了一些复杂的逻辑,那么直接测试它会更容易覆盖大多数路径。
-
太棒了。谢谢你。我将检查我正在做的测试并替换检查数据库是否为空的测试,因此不需要重新创建数据库和执行迁移
标签: node.js knex.js bookshelf.js