Javascript 续集测试-有时验证错误

Javascript 续集测试-有时验证错误,javascript,unit-testing,mocha.js,sequelize.js,Javascript,Unit Testing,Mocha.js,Sequelize.js,我通过Mocha/Chai在sequelize定义上运行单元测试,如图所示: 与mocha tests.js一起运行的Main tests.js: // Testing Dependencies expect = require("chai").expect; should = require("chai").should; require('dotenv').load(); var Sequelize = require('sequelize'); var sequelize = new S

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

mocha tests.js一起运行的Main 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();
    });
  });
}
有时(在代码传递(CI)中,大约15分之一)会出现以下错误:

  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"
模型单元测试
未处理的拒绝SequelizeUniqueConstraintError:验证错误
在Query.formatError(/home/rof/src/github.com/podogether/podtest prototype/node_modules/sequelize/lib/dialogs/postgres/Query.js:402:16)
在空。(/home/rof/src/github.com/podchowe/pod test prototype/node_modules/sequelize/lib/dialogs/postgres/query.js:108:19)
在emitOne(events.js:77:13)
在发出时(events.js:169:7)
在Query.handleError(/home/rof/src/github.com/podchouse/pod test prototype/node_modules/pg/lib/Query.js:108:8)
在空。(/home/rof/src/github.com/podchouse/pod test prototype/node_modules/pg/lib/client.js:171:26)
在emitOne(events.js:77:13)
在发出时(events.js:169:7)
在插座上。(/home/rof/src/github.com/podchowe/podtestprototype/node_modules/pg/lib/connection.js:109:12)
在emitOne(events.js:77:13)
位于Socket.emit(events.js:169:7)
在readableAddChunk(_stream_readable.js:146:16)
在Socket.Readable.push(_stream_Readable.js:110:10)
在TCP.onread(net.js:523:20)
1) 在每个“hook for”之前,用户应具有正确的字段
在本地,这些单元测试没有失败(我可能已经连续运行了60次)。早些时候,我在每次
beforeach
afterEach
中没有使用
done
回调时也看到了类似的问题。这两个都是异步的,需要等待才能继续。修复后,我不再在本地看到这些问题


有人能解释一下这个问题吗?(ssh进入Codeship并运行测试导致1/~15错误)

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

当我捕捉到错误并将完整结果打印到控制台时,它确认违反了唯一约束—具体地说,是主键id列,该列被设置为默认值为自动递增值

我在数据库中植入了记录,尽管这些记录的ID也设置为autoincrement,但200多条记录的ID分散在1和2000之间,但数据库的autoincrement序列设置为从1开始。通常,序列中的下一个id未使用,但偶尔它已被占用,数据库将返回此错误

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


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

我遇到了这个问题。这是由于播种后未正确设置自动增量造成的。根本问题是我们的seed方法在seed方法中显式地设置了主/自动递增键(id),这通常应该避免。我们删除了ID,问题就解决了


下面是我们找到解决方案的sequelize问题的参考资料:

你有没有想过这个问题?我们的单元测试失败的原因可能不少于20%。不,不幸的是我没有。我猜这是某种异步行为,但还没有正确处理?不知道为什么它能在我本地的机器上完美运行,没关系。我解决了我们的问题。我们正在为单元测试生成随机电话号码。测试后无法删除它们,因此该错误是主键约束错误。无论如何谢谢你!我希望你能解决你的问题。