#node.js #mocha.js #sequelize.js
#node.js #mocha.js #sequelize.js
Вопрос:
Я работаю над издевательской базой данных, потому что я модульное тестирование API. Для макетирования я использую библиотеку sequelize-mock, а для моделей я использую sequelize. Когда я вызываю GET-запрос, функция GetAll() возвращает только первый элемент в этом массиве.
Моя макет модели:
const assetmeter = (sequelize) => {
const AssetMeter = sequelize.define('assetmeter', {
id: 1,
assetId: 1,
sequence: null,
meterName: 'BAD',
measureUnit: 'km',
meterType: 'CHARACTERISTIC',
description: 'test description',
active: true,
},{
id: 2,
assetId: 2,
sequence: null,
meterName: 'TEST',
measureUnit: 'TEST',
meterType: 'TEST',
description: 'TEST',
active: true,
});
return AssetMeter;
}
module.exports = assetmeter;
Получить всю функцию:
import { AssetMeter } from '../../models';
import paginate from '../../utils/paginate';
export default async (req, res) => {
let assetMeters = [];
try {
assetMeters = await AssetMeter.findAndCountAll({
limit: req.pagination.limit,
offset: req.pagination.offset
});
console.log(assetMeters);
} catch (err) {
console.log(err);
return res.status(500).send({ error: 'Internal server error' });
}
const links = paginate(req.protocol, req.hostname, req.baseUrl, req.pagination, assetMeters.count);
if (links) {
res.set('Link', links);
}
return res.set('X-Total-Count', assetMeters.count).send(assetMeters.rows);
};
Я ожидаю, что результат вернет два объекта в массиве.
Текущий результат:
[ { id: 1,
assetId: 1,
sequence: null,
meterName: 'BAD',
measureUnit: 'km',
meterType: 'CHARACTERISTIC',
description: 'test description',
active: true,
createdAt: '2019-03-29T07:33:02.812Z',
updatedAt: '2019-03-29T07:33:02.812Z' } ]
Комментарии:
1. Каково значение
req.pagination.limit
иreq.pagination.offset
?2. Значение @bird для нумерации страниц равно 100, смещение равно 0
3. пожалуйста, поделитесь sql-командой, сгенерированной из findAndCountAll. добавьте опцию «log: console.log» точно так же, как параметры ограничения смещения.
4. @RohitDalal я ничего не получил, я думаю, у sequelize нет этой функции
5. В вашем терминале будет создан журнал sql-запроса
Ответ №1:
Боюсь, это ожидаемый результат, я думаю, вы используете define
неправильный путь. Есть 2 вещи.
Во-первых, сигнатура метода:
define(name, [obj={}], [opts]) -> Model
Вы передаете 3 аргумента, но допустим только 2-й. Это объект, содержащий значения по умолчанию для AssetMeter
. Следовательно, 3-й аргумент игнорируется, потому что так и должно быть opts
.
Во-вторых, вы пытаетесь заполнить свой макет многими AssetMeter
, но для этого вам нужно вставить (создать) их. Опять же, второй аргумент — это значения по умолчанию для свойств AssetMeter
(id, AssetID и т.д.).
Вот почему ваш findAll
возвращает только 1 результат, это объект с такими значениями по умолчанию.
Я думаю, что лучший способ сделать это, если вам нужны 2 объекта, — это имитировать запрос с помощью $queueResults
:
const DEFAULT_VALUE: { /*...*/ };
const assetmeter = (sequelize) => {
const AssetMeter = sequelize.define('assetmeter', DEFAULT_VALUE);
AssetMeter.$queueResult([UserMock.build(), UserMock.build(), /* ... */]);
return AssetMeter;
}
module.exports = assetmeter;
Взгляните на документы:https://sequelize-mock.readthedocs.io/en/stable/docs/mock-queries/#queued-results.
Я надеюсь, это поможет!