Всем привет!
Сегодня двинулся дальше в изучении SF и попробовал создать тестовый класс для тестирования триггера.
Для этого, как водится нужно создать одну или несколько записей (records).
Не могу понять логики этого процесса:
- пытаюсь задать значения для вычисляемого формулой поля - компилятор не пропускает, что логично.
- пытаюсь задать значения для несуществующего в объекте поля - компилятор снова не пропускает, что логично.
А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает.
Не могу понять логики этого процесса: где пределы, каковы правила для создание временных записей в тестовых классах. Насколько эти новые записи могут заимодействовать с другими, реальными записями.
Подскажите статьи, workbookи об этом.
Спасибо
Всем привет! Сегодня двинулся дальше в изучении SF и попробовал создать тестовый класс для тестирования триггера. Для этого, как водится нужно создать одну или несколько записей (records). Не могу понять логики этого процесса: - пытаюсь задать значения для вычисляемого формулой поля - компилятор не пропускает, что логично. - пытаюсь задать значения для несуществующего в объекте поля - компилятор снова не пропускает, что логично. А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает. Не могу понять логики этого процесса: где пределы, каковы правила для создание временных записей в тестовых классах. Насколько эти новые записи могут заимодействовать с другими, реальными записями. Подскажите статьи, workbookи об этом. Спасибо
Сегодня неделя тестов в Salesforce
Да именно - триггер срабатывает в редультате выполнения 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е поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.
Вот еще непонятный для меня вопрос:
Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?
Спасибо за статью, выглядит очень хорошо, завтра буду читать. На developer много хорошей информации и отличных workbookов, но не всегда получается найти то, что нужно. Например, ясную информацию о том как заставить работать Портал, я нашел только в вашей статье.
[i][quote]Как ты делал "обязательное" поле? В самом объекте или на layout отмечал? Это два разных способа сделать поле обязательным, только первый случай глобальный, а второй - только работает в браузере. Для backend поле считается обычным. Если ты поле сделал обязательным для в самом объекте при создании, то сделать insert в базу у тебя никак не получися - получишь исключение.[/quote][/i] Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет. Вот еще непонятный для меня вопрос: Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи? Спасибо за статью, выглядит очень хорошо, завтра буду читать. На developer много хорошей информации и отличных workbookов, но не всегда получается найти то, что нужно. Например, ясную информацию о том как заставить работать Портал, я нашел только в вашей статье.
[quote] Вот еще непонятный для меня вопрос: Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи? [/quote] Можно ничего не записывать если поле обязательное на layout, если это лук-ап да еще обязательный в объекте (что я такого не припомню) я бы создал связанные записи.Вообще для такого дела полезно создать отдельный класс который будет делать insert для всех тестовых данных и создавать экзепляр класса для на initData для всех тестов как вариант.
[quote]Вообще для такого дела полезно создать отдельный класс который будет делать insert для всех тестовых данных и создавать экзепляр класса для на initData для всех тестов как вариант.[/quote] Согласен, согласен. Буду пробовать.
Привет вот и мои комментарии
Не будет.
Небольшое разъяснение: Lookup - это поле связи НЕОБЯЗАТЕЛЬНОЕ, Master-Details - поле связи ОБЯЗАТЕЛЬНОЕ. Если в объекте lookup то заполнять его не нужно (если в этом нет необходимости). Произвольный набор цифр и букв НЕЛЬЗЯ записать в поля связи. ТОЛЬКО сгенерированный ID на этапе insert объекта в базу, т.е. НУЖНО создать и ЗАПИСАТЬ в базу объект, на который ты будешь ссылаться.
Согласен, сам до многих вещей дохожу практическим путем. Просто американцы так глубоко в программирование на SF не лезут, и портал так использовать наверное не многие догадываются. Salesforce это не язык программирования - это для многих готовый продукт, который можно использовать из коробки, ну максимум намного изменив стандартную логику.
Привет вот и мои комментарии [quote]Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.[/quote] Не будет. [quote]Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи? [/quote] Небольшое разъяснение: Lookup - это поле связи НЕОБЯЗАТЕЛЬНОЕ, Master-Details - поле связи ОБЯЗАТЕЛЬНОЕ. Если в объекте lookup то заполнять его не нужно (если в этом нет необходимости). Произвольный набор цифр и букв НЕЛЬЗЯ записать в поля связи. ТОЛЬКО сгенерированный ID на этапе insert объекта в базу, т.е. НУЖНО создать и ЗАПИСАТЬ в базу объект, на который ты будешь ссылаться. [quote]Портал, я нашел только в вашей статье[/quote] Согласен, сам до многих вещей дохожу практическим путем. Просто американцы так глубоко в программирование на SF не лезут, и портал так использовать наверное не многие догадываются. Salesforce это не язык программирования - это для многих готовый продукт, который можно использовать из коробки, ну максимум намного изменив стандартную логику.