【问题标题】:How to test sequelize query (where) logic?如何测试 sequelize 查询(where)逻辑?
【发布时间】:2018-07-03 16:14:54
【问题描述】:

我正在尝试编写单元测试来测试搜索查询是否正确,换句话说,where 语句中编写的逻辑是否返回预期结果。

 async function search(some_data){
   return Event.findOne({
    where: {
      id: 123435,
      [Op.or]: [
        days: {
            [Op.overlap]: some_data.days,
        },
        [Op.or]: [
          {
            startTime: {
              [Op.gt]: some_data.start1,
            },
            endTime: {
              [Op.lt]:some_data.end1,
            },
          },
          {
            startTime: {
              [Op.lt]: some_data.start2,
              [Op.lt]: some_data.end2,
            },
            endTime: {
              [Op.gt]: some_data.end2,
              [Op.gt]: some_data.start2,
            },
          },
        ],
    ],
  },
})};

我需要测试不同输入的结果。 我不想把这个测试转成集成测试,用原来的db,所以我用了sequelize-mocklib,但这只返回我定义的结果,并没有运行真正的查询。

【问题讨论】:

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


    【解决方案1】:

    要测试您的方法是否使用正确的参数调用,您需要使用依赖注入和一个库来“窥探”您的findOne 方法。在下面的示例中,我使用的是Sinon

    // app.js
    // Note that "Event" must be used an argument in order to mock it out
    async function search(Event, some_data) {
      return Event.findOne({
        where: {
          id: 123435
        }
      })
    }
    

    如果你的测试文件:

    // your test file
    const app = require('./app');
    const sinon = require('sinon');
    const EventMock = {
      findOne: sinon.spy()
    };
    
    describe('search', () => {
      it('should call with the right parameters', () => {
        const some_data = {};
        search(EventMock, some_data);
    
        assert(EventMock.findOne.calledWith({
          where: {
            id: 123435
          }
        }))
      });
    });
    

    【讨论】:

    • 这不是在回答问题。它只测试传递给findOne 方法的参数,但不测试where 逻辑是否产生预期的查询结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2011-10-02
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多