gpt4 book ai didi

javascript - Sequelize 测试 - 有时验证错误

转载 作者:搜寻专家 更新时间:2023-11-01 04:30:41 27 4
gpt4 key购买 nike

我正在通过 Mocha/Chai 在 sequelize 定义上运行单元测试,如下所示:

mocha tests.js 一起运行的主要 tests.js:

// Testing Dependencies
expect = require("chai").expect;
should = require("chai").should;
require('dotenv').load();

var Sequelize = require('sequelize');
var sequelize = new Sequelize(
process.env.PG_DB_TEST,
process.env.PG_USER,
process.env.PG_PASSWORD, {
dialect: "postgres",
logging: false
});

var models = require('./models/db')(sequelize);

var seq_test = function (next) {
return function () {
beforeEach(function (done) {
sequelize.sync({ force: true }).then(function() {
done();
});
});

afterEach(function (done) {
sequelize.drop().then(function() {
done();
});
});

next();
};
}

describe("Model Unittests", seq_test(function () {
require("./models/tests/test_user.js")(models);
require("./models/tests/test_interest.js")(models);
}));

test_user.js

var mockedUser = require("./mocks/user");

module.exports = function (models) {
var User = models.user;
it("User should have the correct fields", function (done) {
User.create(mockedUser).then(function (result) {
expect(result.pack()).to.include.all.keys(
["id", "name", "email", "intro"]
);
done();
});
});

it("User should require an email", function (done) {
User.create({
"name": mockedUser['name']
}).then(function (result) {
expect.fail();
done();
}).catch(function (err) {
expect(err['name']).to.be.equal('SequelizeValidationError');
done();
});
});

it("User should require a name", function (done) {
User.create({
"email": mockedUser['email']
}).then(function (result) {
expect.fail();
done();
}).catch(function (err) {
expect(err['name']).to.be.equal('SequelizeValidationError');
done();
});
});
}

有时(在 Codeship (CI) 上大约 15 个中有 1 个),它会给出此错误:

  Model Unittests
Unhandled rejection SequelizeUniqueConstraintError: Validation error
at Query.formatError (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/sequelize/lib/dialects/postgres/query.js:402:16)
at null.<anonymous> (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/sequelize/lib/dialects/postgres/query.js:108:19)
at emitOne (events.js:77:13)
at emit (events.js:169:7)
at Query.handleError (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/pg/lib/query.js:108:8)
at null.<anonymous> (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/pg/lib/client.js:171:26)
at emitOne (events.js:77:13)
at emit (events.js:169:7)
at Socket.<anonymous> (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/pg/lib/connection.js:109:12)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
1) "before each" hook for "User should have the correct fields"

在本地,这些单元测试没有失败(我可能已经运行了……连续 60 次)。当我没有在 beforeEachafterEach 中使用 done 回调时,我早些时候看到了类似的问题。这两个都是异步的,需要等待才能继续。修复后,我不再在本地看到这些问题。

任何人都可以阐明这个问题吗? (ssh 进入 Codeship 并运行导致 1/~15 错误的测试)

最佳答案

我的 QA 数据库遇到了这个问题。有时一条新记录会保存到数据库中,有时会失败。在我的开发工作站上执行相同的过程时,它每次都会成功。

当我发现错误并将完整结果打印到控制台时,它确认违反了唯一约束 - 特别是主键 id 列,该列默认设置为自动递增的值。

我已经在我的数据库中添加了记录,尽管这些记录的 ID 也设置为自动递增,但 200 多条记录的 ID 分散在 1 到 2000 之间,但数据库的自动递增序列设置为从1. 通常顺序下一个id没有被使用,但偶尔已经被占用,数据库会返回这个错误。

我使用了答案 here将序列重置为在我的最后一个播种记录之后开始,现在它每次都有效。

如果您正在播种记录以运行集成测试,则数据库自动增量序列可能未设置为跟随它们。 Sequelize 没有此功能,因为它是一个简单的单一命令操作,需要在数据库中运行。

关于javascript - Sequelize 测试 - 有时验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32557766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com