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

Правила создания record в APEX коде при тестирования триггер

Всем привет!
Сегодня двинулся дальше в изучении SF и попробовал создать тестовый класс для тестирования триггера.
Для этого, как водится нужно создать одну или несколько записей (records).

Не могу понять логики этого процесса:
- пытаюсь задать значения для вычисляемого формулой поля - компилятор не пропускает, что логично.
- пытаюсь задать значения для несуществующего в объекте поля - компилятор снова не пропускает, что логично.
А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает.

Не могу понять логики этого процесса: где пределы, каковы правила для создание временных записей в тестовых классах. Насколько эти новые записи могут заимодействовать с другими, реальными записями.

Подскажите статьи, workbookи об этом.
Спасибо

Всем привет!
Сегодня двинулся дальше в изучении SF и попробовал создать тестовый класс для тестирования триггера.
Для этого, как водится нужно создать одну или несколько записей (records).

Не могу понять логики этого процесса:
- пытаюсь задать значения для вычисляемого формулой поля - компилятор не пропускает, что логично.
- пытаюсь задать значения для несуществующего в объекте поля - компилятор снова не пропускает, что логично.
А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает.

Не могу понять логики этого процесса: где пределы, каковы правила для создание временных записей в тестовых классах. Насколько эти новые записи могут заимодействовать с другими, реальными записями.

Подскажите статьи, workbookи об этом.
Спасибо

Сегодня неделя тестов в Salesforce

Для этого, как водится нужно создать одну или несколько записей (records).

Да именно - триггер срабатывает в редультате выполнения DML операций.
Т.е. создаем объект, заполняем поля нужными данными делаем insert в базу и т.д.

А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает.

Как ты делал "обязательное" поле? В самом объекте или на layout отмечал? Это два разных способа сделать поле обязательным, только первый случай глобальный, а второй - только работает в браузере. Для backend поле считается обычным. Если ты поле сделал обязательным для в самом объекте при создании, то сделать insert в базу у тебя никак не получися - получишь исключение.

Не могу понять логики этого процесса: где пределы, каковы правила для создание временных записей в тестовых классах. Насколько эти новые записи могут заимодействовать с другими, реальными записями.

Все просто - каждый тест метод запускается в отдельном "пустом" окружении. По умолчанию тесты не видят реальные данные, если не обозначить его специальной аннотацией @isTest(SeeAllData=true). Т.е. можно создавть все что душе угодно, никаких ограничений нет. После окончания все тестовые данные удаляются. И в следующем тест методе придется запускать инициализацию по новой.
Совет - никогда не использовать @isTest(SeeAllData=true) - потому что не известно какие данные есть на орге клиента - все данные нужно создавать на этапе инициализации тестов.

Статей небольших много, и все они однотипные (можно нагуглить).
Вот могу посоветовать эту
An Introduction to Apex Code Test Methods

В принципе в тестах ничего сложного нет. Если воспрользоваться шаблоном из моей статьи то этого вполне хватит для 90% случаев.

Сегодня неделя тестов в Salesforce :)

[quote]Для этого, как водится нужно создать одну или несколько записей (records).[/quote]

Да именно - триггер срабатывает в редультате выполнения DML операций.
Т.е. создаем объект, заполняем поля нужными данными делаем insert в базу и т.д.

[quote]А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает.[/quote]

Как ты делал "обязательное" поле? В самом объекте или на layout отмечал? Это два разных способа сделать поле обязательным, только первый случай глобальный, а второй - только работает в браузере. Для backend поле считается обычным. Если ты поле сделал обязательным для в самом объекте при создании, то сделать insert в базу у тебя никак не получися - получишь исключение.

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

Все просто - каждый тест метод запускается в отдельном "пустом" окружении. По умолчанию тесты не видят реальные данные, если не обозначить его специальной аннотацией @isTest(SeeAllData=true). Т.е. можно создавть все что душе угодно, никаких ограничений нет. После окончания все тестовые данные удаляются. И в следующем тест методе придется запускать инициализацию по новой.
Совет - никогда не использовать @isTest(SeeAllData=true) - потому что не известно какие данные есть на орге клиента - все данные нужно создавать на этапе инициализации тестов.

Статей небольших много, и все они однотипные (можно нагуглить).
Вот могу посоветовать эту 
[url=http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods]An Introduction to Apex Code Test Methods[/url]

В принципе в тестах ничего сложного нет. Если воспрользоваться шаблоном из [url=http://salesforce-developer-rus.blogspot.com/2013/01/testing-apex-code.html]моей статьи[/url] то этого вполне хватит для 90% случаев.

Как ты делал "обязательное" поле? В самом объекте или на layout отмечал? Это два разных способа сделать поле обязательным, только первый случай глобальный, а второй - только работает в браузере. Для backend поле считается обычным. Если ты поле сделал обязательным для в самом объекте при создании, то сделать insert в базу у тебя никак не получися - получишь исключение.

Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.

Вот еще непонятный для меня вопрос:
Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?

Спасибо за статью, выглядит очень хорошо, завтра буду читать. На developer много хорошей информации и отличных workbookов, но не всегда получается найти то, что нужно. Например, ясную информацию о том как заставить работать Портал, я нашел только в вашей статье.

[i][quote]Как ты делал "обязательное" поле? В самом объекте или на layout отмечал? Это два разных способа сделать поле обязательным, только первый случай глобальный, а второй - только работает в браузере. Для backend поле считается обычным. Если ты поле сделал обязательным для в самом объекте при создании, то сделать insert в базу у тебя никак не получися - получишь исключение.[/quote][/i]

Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.

Вот еще непонятный для меня вопрос:
Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи  что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?  

Спасибо за статью, выглядит очень хорошо, завтра буду читать. На developer много хорошей информации и отличных workbookов, но не всегда получается найти то, что нужно. Например, ясную информацию о том как заставить работать Портал, я нашел только в вашей статье.

Вот еще непонятный для меня вопрос:
Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?

Можно ничего не записывать если поле обязательное на layout, если это лук-ап да еще обязательный в объекте (что я такого не припомню) я бы создал связанные записи.Вообще для такого дела полезно создать отдельный класс который будет делать insert для всех тестовых данных и создавать экзепляр класса для на initData для всех тестов как вариант.

[quote]
Вот еще непонятный для меня вопрос:
Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи  что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?  
[/quote]
Можно ничего не записывать если поле обязательное на layout, если это лук-ап да еще обязательный в объекте (что я такого не припомню) я бы создал связанные записи.Вообще для такого дела полезно создать отдельный класс который будет делать insert для всех тестовых данных и создавать экзепляр класса для на initData для всех тестов как вариант.

Вообще для такого дела полезно создать отдельный класс который будет делать insert для всех тестовых данных и создавать экзепляр класса для на initData для всех тестов как вариант.

Согласен, согласен. Буду пробовать.

[quote]Вообще для такого дела полезно создать отдельный класс который будет делать insert для всех тестовых данных и создавать экзепляр класса для на initData для всех тестов как вариант.[/quote]
Согласен, согласен. Буду пробовать.

Привет вот и мои комментарии

Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.

Не будет.

Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?

Небольшое разъяснение: Lookup - это поле связи НЕОБЯЗАТЕЛЬНОЕ, Master-Details - поле связи ОБЯЗАТЕЛЬНОЕ. Если в объекте lookup то заполнять его не нужно (если в этом нет необходимости). Произвольный набор цифр и букв НЕЛЬЗЯ записать в поля связи. ТОЛЬКО сгенерированный ID на этапе insert объекта в базу, т.е. НУЖНО создать и ЗАПИСАТЬ в базу объект, на который ты будешь ссылаться.

Портал, я нашел только в вашей статье

Согласен, сам до многих вещей дохожу практическим путем. Просто американцы так глубоко в программирование на SF не лезут, и портал так использовать наверное не многие догадываются. Salesforce это не язык программирования - это для многих готовый продукт, который можно использовать из коробки, ну максимум намного изменив стандартную логику.

Привет вот и мои комментарии

[quote]Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.[/quote]

Не будет.

[quote]Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи? [/quote]

Небольшое разъяснение: Lookup - это поле связи НЕОБЯЗАТЕЛЬНОЕ, Master-Details - поле связи ОБЯЗАТЕЛЬНОЕ. Если в объекте lookup то заполнять его не нужно (если в этом нет необходимости). Произвольный набор цифр и букв НЕЛЬЗЯ записать в поля связи. ТОЛЬКО сгенерированный ID на этапе insert объекта в базу, т.е. НУЖНО создать и ЗАПИСАТЬ в базу объект, на который ты будешь ссылаться.

[quote]Портал, я нашел только в вашей статье[/quote]

Согласен, сам до многих вещей дохожу практическим путем. Просто американцы так глубоко в программирование на SF не лезут, и портал так использовать наверное не многие догадываются. Salesforce это не язык программирования - это для многих готовый продукт, который можно использовать из коробки, ну максимум намного изменив стандартную логику.