Jam*_*oop 5 testing postgresql mocha.js node.js sequelize.js
我正在尝试为每个测试自动化构建,播种和销毁我的数据库。我正在使用PostgreSQL,Mocha和Sequelize。
我找到了一个库:sequelize-fixtures,使我步入正轨,但最终它非常不一致,有时会引发约束错误:Unhandled rejection SequelizeUniqueConstraintError: Validation error
即使我对模型没有任何验证。
这是我进行测试的方式
const sequelize = new Sequelize('test_db', 'db', null, {
logging: false,
host: 'localhost',
port: '5432',
dialect: 'postgres',
protocol: 'postgres'
})
describe('/auth/whoami', () => {
beforeEach((done) => {
Fixtures.loadFile('test/fixtures/data.json', models)
.then(function(){
done()
})
})
afterEach((done) => {
sequelize.sync({
force: true
}).then(() => {
done()
})
})
it('should connect to the DB', (done) => {
sequelize.authenticate()
.then((err) => {
expect(err).toBe(undefined)
done()
})
})
it('should test getting a user', (done) => {
models.User.findAll({
attributes: ['username'],
}).then((users) => {
users.forEach((user) => {
console.log(user.password)
})
done()
})
})
})
Run Code Online (Sandbox Code Playgroud)
我的模型定义如下:
var Sequelize = require('sequelize'),
db = require('./../utils/db')
var User = db.define('User', {
username: {
type: Sequelize.STRING(20),
allowNull: false,
notEmpty: true
},
password: {
type: Sequelize.STRING(60),
allowNull: false,
notEmpty: true
}
})
module.exports = User
Run Code Online (Sandbox Code Playgroud)
错误日志:
Fixtures: reading file test/fixtures/data.json...
Executing (default): CREATE TABLE IF NOT EXISTS "Users" ("id" SERIAL , "username" VARCHAR(20) NOT NULL, "password" VARCHAR(60) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id"));
Executing (default): SELECT "id", "username", "password", "createdAt", "updatedAt" FROM "Users" AS "User" WHERE "User"."id" = 1 AND "User"."username" = 'Test User 1' AND "User"."password" = 'testpassword';
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'Users' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
Executing (default): INSERT INTO "Users" ("id","username","password","createdAt","updatedAt") VALUES (1,'Test User 1','testpassword','2016-04-29 23:15:08.828 +00:00','2016-04-29 23:15:08.828 +00:00') RETURNING *;
Unhandled rejection SequelizeUniqueConstraintError: Validation error
Run Code Online (Sandbox Code Playgroud)
这曾经工作过,然后再也没有。在每次测试之前,是否有更健壮的方法可以使我从一个完全干净的数据库开始,以便我填充要运行的测试数据?
此外,如果有哪位朋友知道为什么我仍然得到console.logs()
,即使我有logging: false
上,那将不胜感激。
您粘贴的错误似乎表明相同的数据被多次插入,导致id
列上发生冲突。
我希望调用sequelize.sync({force: true})
会在每次运行时清除所有数据库表,但情况似乎并非如此。您可以尝试将调用移至挂钩beforeEach
,以确保要运行的第一个测试也具有新的数据库。
在我正在开发的应用程序中,我们不会为每个测试重新同步数据库,而是在开始时执行一次并在测试之间截断表。我们使用如下所示的清理函数:
function cleanup() {
return User.destroy({ truncate: true, cascade: true });
}
Run Code Online (Sandbox Code Playgroud)
方法create
执行从 json 设备加载数据并将其插入数据库的工作。
function create() {
var users = require('./fixtures/user.json');
return User.bulkCreate(users);
}
Run Code Online (Sandbox Code Playgroud)
您也许可以通过省略sequelize-fixtures
和自行处理某些事情来简化依赖关系并提高稳定性。
另外,一个不相关的建议:Sequelize 的方法返回承诺 Mocha 可以本地处理,因此无需done
在测试和设置/拆卸代码中使用回调:
it('should connect to the DB', () => {
return sequelize.authenticate()
})
Run Code Online (Sandbox Code Playgroud)
如果承诺被拒绝,测试就会失败。
此外,Mocha 的文档目前建议不要使用箭头函数:
不鼓励将箭头函数传递给 Mocha。它们的值的词法绑定
this
使它们无法访问 Mocha 上下文,并且类似的语句this.timeout(1000);
在箭头函数内不起作用。
归档时间: |
|
查看次数: |
1254 次 |
最近记录: |