【问题标题】:How to test objection.js with jest?如何用玩笑测试 objection.js?
【发布时间】:2020-06-30 14:12:17
【问题描述】:
Model.knex(knex);

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(i18nextMiddleware);

我想测试用户控制器的 getUsers 方法。它从 usersModel getUsers 方法获取数据。我通过 Objections ORM 从 MySQL 获取日期。

app.get(
  '/',
  checkFilter(['type']),
  users.getUsers
);

按照说明,我正在更改查询方式。

class MyQueryBuilder extends QueryBuilder {
  query() {
    return this.resolve({ test: 11111 });
  }
}

class UsersModel extends Model {
  static get QueryBuilder() {
    return MyQueryBuilder;
  }
}

jest.spyOn(Users, 'query')
  .mockImplementation(UsersModel.query);

描述测试。

describe('get errors', () => {
  beforeAll(done => {
    i18next.on('initialized', () => {
      done()
    });
  });

  it('with filter', done => {
    request(app)
      .get('/')
      .query({page: 0, perPage: 5, type: 'admin'})
      .end((err, res) => {
        if (err) return done(err);

        expect(res.status).toBe(200);
        expect(
          Object.keys(res.body).sort()
        ).toEqual([
          'items',
          'itemsOnPage',
          'currentPage',
          'totalPage',
          'totalItems'
        ].sort());
        expect(res.body.items).toHaveLength(8);
        expect(res.body.totalItems).toBe(usersMockDB.getUsers.length);

        console.log(res.body);

        done();
      });
  });

  afterAll(done => {
    knex.destroy();

    done();
  })
});

用户模型的getUsers方法。

    const { Users } = require('../../db/models/Users');

    const query = Users
      .query()
      .select(
        'id',
        'login',
        'type',
        'edit',
        'email',
        'phone',
        'block'
      )
      .orderBy('id', 'DESC')
      .page(page, perPage);

    // filter

    if (Object.keys(usersFilter).length) {
      for (let field in usersFilter) {
        if ( usersFilter.hasOwnProperty(field) ) {
          query.where(field, 'like', `%${ usersFilter[field] }%`);
        }
      }
    }

    const { results, total } = await query;

    return {
      items:       results,
      itemsOnPage: Number(perPage),
      currentPage: Number(page),
      totalPage:   Math.ceil(total/perPage),
      totalItems:  Number(total)
    }

我应该覆盖方法页面吗?据我了解,他们会进行新的数据库查询。

【问题讨论】:

    标签: jestjs objection.js


    【解决方案1】:

    这可能并非在所有情况下都可取,但我发现使用反对模型的单元测试最简单的解决方案是为每个测试创建一个事务。这确实意味着您将需要一个数据库来运行测试,但在测试之间一切都会回滚。

    在jest.config.js,添加这一行

    setupFilesAfterEnv: ['./jest.setup.js'],
    

    在jest.setup.js:

    import objection from 'objection';
    import knex from './src/db/index.js'; // Change src/db/index.js to the path to the file where you export your knex instance
    
    const {transaction, Model} = objection;
    
    global.beforeAll(async () => {
        global.knex = knex;
        global.txn = null;
    });
    
    global.beforeEach(async () => {
        global.txn = await transaction.start(knex);
        Model.knex(global.txn);
    });
    
    global.afterEach(async () => {
        await global.txn.rollback();
        Model.knex(knex);
    });
    
    global.afterAll(async () => {
        global.knex.destroy();
    });
    

    然后您可以在代码和单元测试中按预期使用模型

    import {User} from './src/db/models/index.js';
    
    it('creates and reads users', async () => {
        const user = await User.query().insert({email: 'test@test.com'});
        const users = await User.query();
    
        expect(users).toHaveLength(1);
    });
    
    it('does not persist users between tests', async () => {
        const users = await User.query();
    
        expect(users).toHaveLength(1);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-10
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2018-01-29
      • 2019-02-22
      • 2018-08-12
      相关资源
      最近更新 更多