Попытка создать фиктивные данные запроса Knex для тестирования функции - PullRequest
0 голосов
/ 16 мая 2019

У меня есть эта функция для отображения пользовательских данных:

    users.listUsers = async (params, db) => {
        const { sName, sEmail } = params;
        let { sortBy, descending } = params;
        const { offset = 0, limit = 20 } = params;

        // Users
        const query = db.knex.select([
          'users.id',
          'users.name',
          'users.email',
          'sup.id as sup_id',
          'sup.title',
        ]).from('users')
          .count('cus_users.id')
          .leftJoin('sup_users', 'users.id', 'sup_users.user_id')
          .innerJoin('sup', 'sup.id', 'sup_users.sup_id')
          .innerJoin('cus', 'cus.sup_id', 'sup.id')
          .leftJoin('cus_users', function additionalAnd() {
            this.on('cus.id', 'cus_users.cus_id')
              .andOn('users.id', 'cus_users.user_id');
          })
          .groupByRaw('users.id, users.name, users.email, sup.id, sup.title');

        if (sName) {
          query.where('users.name', 'ILIKE', `%${sName}%`);
        }
        if (sEmail) {
          query.where('users.email', 'ILIKE', `%${sEmail}%`);
        }

        if (sortBy && descending) {
          sortBy = ORDER_FIELDS.indexOf(sortBy) !== -1 ? sortBy : null;
          descending = String(descending).toLowerCase() === 'true' ? 'DESC' : 'ASC';
          query.orderBy(sortBy, descending);
        }
        if (offset && limit) {
          query.offset(offset).limit(limit);
        }

        let users = await query.offset(offset).limit(limit);

        users = users.reduce((accumulator, item) => {
          if (accumulator[item.id]) {
            const group = accumulator[item.id];
            group.sup.push({
              id: item.sup_id,
              code: item.code,
              title: item.title,
            });
            group.count = `${(+group.count) + (+item.count)}`;
          } else {
            accumulator[item.id] = item;
            accumulator[item.id].sup = [];
            accumulator[item.id].sup.push({
              id: item.sup_id,
              code: item.code,
              title: item.title,
            });
            delete accumulator[item.id].sup_id;
            delete accumulator[item.id].code;
            delete accumulator[item.id].title;
          }
          return accumulator;
        }, {});

        users = Object.values(users);
        return users;
      };

Я сейчас пытаюсь написать для нее модульный тест.Я хотел бы создать некоторые фиктивные данные запроса и проверить, что то, что возвращает listUsers, корректно по отношению к фиктивным данным.Я не уверен, как настроить этот макет, хотя.В настоящее время я смотрю на mock-knex и вижу, как создать фиктивную базу данных.Я не знаю, куда идти оттуда, хотя.Кто-нибудь может посоветовать?

Дополнительная информация

Это то, что я сейчас имею в своем тесте:

var knex = require('knex');
      var mockDb = require('mock-knex');
      var db = knex({
          client: 'pg',
          User: {}
      });

      mockDb.mock(db);

      var tracker = mockDb.getTracker();
      tracker.install();
      tracker.on('query', (query) => {
        query.response([
          { id: 17,
            name: 'John Doe',
            email: 'john@doe.com',
            sup_id: 1,
            title: 'Supplier One',
            code: 'supplierOne',
            count: '1'
          }
        ]);
      });

      const params = {       
        sName: 'name',    
        sEmail: 'email',    
        sortBy: 'name',    
        descending: 'true',    
        offset: 0,    
        limit: 20,    
      };

      it.only('should search users', () => {

        return User.listUsers(params, mockDb)
        .then((res) => {
        });
      })   
    });
});

Когда я запускаю его, я получаю этоошибка:

TypeError: Cannot read property 'knex' of undefined

Это происходит в этой строке моей функции:

const query = db.knex.select([
...