用postgres和sequelize-mock继续单元测试模拟

时间:2017-12-27 09:35:30

标签: node.js postgresql unit-testing mocking sequelize.js

我正在尝试使用sequelize-mock,node和postgres进行构建单元测试,但每当我查询我的模拟时,无论我是否在模拟中获取当前数据,我都会得到结果。根据我的查询,似乎sequelize-mock是automatically generated results。我尝试使用autoQueryFallback选项,但我收到SequelizeMockEmptyQueryQueueError

例如:

describe('/GET/:email/exists', () => {
  it('it should check if email exists - it should fail', async () => {
    const email = 'somemail@mail.com';
    try {
      const res = await fakeDbUtil.isEmailExistsDb(email);
      chai.assert.equal(res, null);
    } catch(e) {
      console.log(e);
    }
  });
});

我的模拟数据库中没有给定的电子邮件,因此我希望得到null结果。但是,我得到的结果包含我的模拟以及当前的电子邮件(覆盖我的模拟原始电子邮件)。

我不确定我做错了什么? 还有其他一些好的模拟框架可以用于postgres和sequelize吗?

1 个答案:

答案 0 :(得分:0)

是的,autoQueryFallback: true选项允许sequelize-mock根据“模型”属性生成自动结果。如果您不希望获得自动化结果,则可以在定义模型对象时或在sequelizeMock对象上声明autoQueryFallback: false

    const UserMock = SequelizeMock.define("user", {}, {
                          autoQueryFallback: false
                        });

要模拟数据,可以使用Sequelize-mock QueryInterface将查询结果排队。

因此,在您的情况下,您可以模拟如下电子邮件。

UserMock.$queueResult(UserMock.build({
  id: 2,
  email: "something@gmail.com"
}));

然后您可以调用数据库查询函数并期待结果。

const res = await fakeDbUtil.isEmailExistsDb(email);
expect(res.email).not.toBe("expectedEmail")

有关模拟序列化模型的更多信息,请this

此测试更像是 Jest 框架方法。这是一个很好的测试框架。如果您想尝试一下,请查看this