Используемые технологии: Node.js, Express, Mongoose, Mocha, lodash
При тестировании моего сервиса мое приложение:
- Получает результат от сохранения нового документа с использованием Mongoose
- Использует lodash.cloneDeep () для клонирования результата
- Пытается изменить содержимое клонированного экземпляра
В результате я получаю клонированный документ, который находится в действительно странном состоянии. При попытке изменить значения, если я запрашиваю значения определенных объектов, которые были изменены, он показывает правильное значение. Однако, когда я просто выгружаю сам документ в консоль, создается впечатление, что я не обновил значения. Аналогично, если я передам документ в подпрограмму сохранения, он сохранит документ в MongoDb, как будто я не изменил никаких значений.
Вот код:
Тестовый код:
describe('### UPDATE ALARM', function () {
it('Should save an alarm record for newly created asset', async () => {
var asset = await Asset.findOne({ _id: compAdminAsset })
const req = { user: { _id: compAdminId } }
var alarm = await AlarmController.getByAsset(req, asset)
expect(alarm._user).to.be.equal(compAdminId)
expect(alarm._asset).to.be.equal(compAdminAsset)
var newAlarm = _.cloneDeep(alarm)
console.log('#### Newly Cloned Alarm Object')
console.log(newAlarm)
// change the rhSettings values
newAlarm.rhSettings.rhAlarmLow = true
newAlarm.rhSettings.rhAlarmHigh = true
newAlarm.rhSettings.rhLow = 40
newAlarm.rhSettings.rhHigh = 85
console.log()
console.log('#### Cloned Alarm Object AFTER updating values')
console.log(newAlarm)
console.log()
console.log('#### Directly query the values that were changed ')
console.log('newAlarm.rhSettings.rhAlarmLow: ' + newAlarm.rhSettings.rhAlarmLow)
console.log('newAlarm.rhSettings.rhAlarmHigh: ' + newAlarm.rhSettings.rhAlarmHigh)
console.log('newAlarm.rhSettings.rhLow: ' + newAlarm.rhSettings.rhLow)
console.log('newAlarm.rhSettings.rhLow: '+ newAlarm.rhSettings.rhHigh)
var savedAlarm = await AlarmController.update(req, newAlarm)
.
.
.
})
})
Вывод из кода теста:
### UPDATE ALARM
#### Newly Cloned Alarm Object
{ rhSettings:
{ rhLow: 0, rhHigh: 80, rhAlarmLow: false, rhAlarmHigh: false },
tempSettings:
{ tempLow: 50,
tempHigh: 100,
tempAlarmLow: false,
tempAlarmHigh: false },
_user: 'c86a7618-2323-48ec-b9e0-0d953301e37f',
_asset: '6ca7a1ba-fc16-4cbf-9b4d-029c508d6b6c',
_id: 5bde26a5038bec31683b8d80,
createdAt: 2018-11-03T22:52:21.604Z,
updatedAt: 2018-11-03T22:52:21.604Z,
__v: 0 }
#### Cloned Alarm Object AFTER updating values
{ rhSettings:
{ rhLow: 0, rhHigh: 80, rhAlarmLow: false, rhAlarmHigh: false },
tempSettings:
{ tempLow: 50,
tempHigh: 100,
tempAlarmLow: false,
tempAlarmHigh: false },
_user: 'c86a7618-2323-48ec-b9e0-0d953301e37f',
_asset: '6ca7a1ba-fc16-4cbf-9b4d-029c508d6b6c',
_id: 5bde26a5038bec31683b8d80,
createdAt: 2018-11-03T22:52:21.604Z,
updatedAt: 2018-11-03T22:52:21.604Z,
__v: 0 }
#### Query the values that were changed directly
newAlarm.rhSettings.rhAlarmLow: true
newAlarm.rhSettings.rhAlarmHigh: true
newAlarm.rhSettings.rhLow: 40
newAlarm.rhSettings.rhLow: 85
Код, который возвращает объект "newAlarm":
const Model = require('../models/alarm.model')
exports.getByAsset = async function (req, asset) {
let newAlarm = new Model()
newAlarm._asset = asset._id
newAlarm._user = req.user._id
newAlarm.rhSettings = asset.rhSettings
newAlarm.tempSettings = asset.tempSettings
return await newAlarm.save()
}
Есть идеи, что приводит к тому, что клонированный объект JSON находится в этом странном состоянии?