Регистрация  |  Вход

Тригер на Update покрывается тестом в котором нет Update

Случайно столкнулся с загадочной ситуацией.

есть тригер на before update, который срабатывает если в пришедшей записи изменилось поле Статус на значение Закрыто.

написал Юнит Тест - покрывает только на 50%.

начала дебажить - запись не проходит условие - как было в поле Статус "Открыто", так и осталось.

Еще раз глянул на свой Юнит тест: ба, да я меняю значение в поле Статус на Закрыто, но не апдатирую запись после этого. Забыл поставить апдейт операцию!

Вопрос: как без единого апдейта в тесте тригер на before update срабатывал (я вижу в Логе дебаги из него), и даже доходил до перебора записей в trigger.new, покрываясь тестом на 50%!!!

Случайно столкнулся с загадочной ситуацией.

есть тригер на [b]before update[/b], который срабатывает если в пришедшей записи изменилось поле Статус на значение Закрыто. 

написал Юнит Тест - покрывает только на 50%.

начала дебажить - запись не проходит условие - как было в поле Статус "Открыто", так и осталось.

Еще раз глянул на свой Юнит тест: ба, да я меняю значение в поле Статус на Закрыто, но не апдатирую запись после этого. Забыл поставить апдейт операцию!

Вопрос: как без единого апдейта в тесте тригер на [b]before update[/b] срабатывал (я вижу в Логе дебаги из него), и даже доходил до перебора записей в trigger.new, покрываясь тестом на 50%!!!

Если сработал триггер - значит выполнилась DML операция. Тут никакой магии нет.

Ищи по коду где у тебя создается или апдейтится данный объект в другом месте.

! Хотя нет, соврал - есть магия. Один раз, в начале своей карьеры столкнулся с этим - ломал голову дня два.
Если есть Rollup Summary для child объектов или Search Filter (вроде), то при апдейте связанных объектов твой объект тоже может обновиться.

Млин, объяснил на пальцах куда копнуть. Но все равно попробуй первый вариант про "в другом месте".

Если сработал триггер - значит выполнилась DML операция. Тут никакой магии нет.

Ищи по коду где у тебя создается или апдейтится данный объект в другом месте.

! Хотя нет, соврал - есть магия. Один раз, в начале своей карьеры столкнулся с этим - ломал голову дня два.
Если есть Rollup Summary для child объектов или Search Filter (вроде), то при апдейте связанных объектов твой объект тоже может обновиться. 

Млин, объяснил на пальцах куда копнуть. Но все равно попробуй первый вариант про "в другом месте".

Dmitry Shnyrev
! Хотя нет, соврал - есть магия. Один раз, в начале своей карьеры столкнулся с этим - ломал голову дня два.
Если есть Rollup Summary для child объектов или Search Filter (вроде), то при апдейте связанных объектов твой объект тоже может обновиться.

Млин, объяснил на пальцах куда копнуть. Но все равно попробуй первый вариант про "в другом месте".

Других апдейтов в тесте нет.

Но ты отгадал загадку!

в процессе подготовки данных для теста создаются связаные записи из 4 объектов.

наша запись - 3 по счету.

после нее вставляется дочерняя запись, которая участвует в рол-ап поле "нашей" уже ставленной записи.

вот тут то (вероятно) наша запись апдатируется по-тихому, провоцирую тригер.

а я то и не знал, что так бывает! кроме того как видим апдейт происходит не только на апдейт дочерней записи, а даже на вставку дочерней записи (что логично).

[quote="Dmitry Shnyrev"]
! Хотя нет, соврал - есть магия. Один раз, в начале своей карьеры столкнулся с этим - ломал голову дня два.
Если есть Rollup Summary для child объектов или Search Filter (вроде), то при апдейте связанных объектов твой объект тоже может обновиться. 

Млин, объяснил на пальцах куда копнуть. Но все равно попробуй первый вариант про "в другом месте".[/quote]

Других апдейтов в тесте нет.

Но ты отгадал загадку! 

в процессе подготовки данных для теста создаются связаные записи из 4 объектов.

наша запись - 3 по счету.

после нее вставляется дочерняя запись, которая участвует в рол-ап поле "нашей" уже ставленной записи.

вот тут то (вероятно) наша запись [b]апдатируется по-тихому, провоцирую тригер[/b].

а я то и не знал, что так бывает! кроме того как видим апдейт происходит не только на апдейт дочерней записи, а даже на вставку дочерней записи (что логично).