【问题标题】:sequelize unit-test mocking with postgres and sequelize-mock使用 postgres 和 sequelize-mock 进行单元测试模拟
【发布时间】:2018-06-07 22:47:08
【问题描述】:

我正在尝试使用 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 一起使用的好的模拟框架吗?

【问题讨论】:

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


    【解决方案1】:

    是的,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")
    

    有关 mocking sequelize 模型的更多信息,请查看this out。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多