У меня есть эта функция для отображения пользовательских данных:
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([