Всем привет!
Сегодня двинулся дальше в изучении SF и попробовал создать тестовый класс для тестирования триггера.
Для этого, как водится нужно создать одну или несколько записей (records).
Не могу понять логики этого процесса:
- пытаюсь задать значения для вычисляемого формулой поля - компилятор не пропускает, что логично.
- пытаюсь задать значения для несуществующего в объекте поля - компилятор снова не пропускает, что логично.
А вот если в новой записи не задано значение ни для одного обязательного поля - все ОК, тест срабатывает.
Не могу понять логики этого процесса: где пределы, каковы правила для создание временных записей в тестовых классах. Насколько эти новые записи могут заимодействовать с другими, реальными записями.
Подскажите статьи, workbookи об этом.
Спасибо
Сегодня неделя тестов в Salesforce
Да именно - триггер срабатывает в редультате выполнения DML операций.
Т.е. создаем объект, заполняем поля нужными данными делаем insert в базу и т.д.
Как ты делал "обязательное" поле? В самом объекте или на layout отмечал? Это два разных способа сделать поле обязательным, только первый случай глобальный, а второй - только работает в браузере. Для backend поле считается обычным. Если ты поле сделал обязательным для в самом объекте при создании, то сделать insert в базу у тебя никак не получися - получишь исключение.
Все просто - каждый тест метод запускается в отдельном "пустом" окружении. По умолчанию тесты не видят реальные данные, если не обозначить его специальной аннотацией @isTest(SeeAllData=true). Т.е. можно создавть все что душе угодно, никаких ограничений нет. После окончания все тестовые данные удаляются. И в следующем тест методе придется запускать инициализацию по новой.
Совет - никогда не использовать @isTest(SeeAllData=true) - потому что не известно какие данные есть на орге клиента - все данные нужно создавать на этапе инициализации тестов.
Статей небольших много, и все они однотипные (можно нагуглить).
Вот могу посоветовать эту
An Introduction to Apex Code Test Methods
В принципе в тестах ничего сложного нет. Если воспрользоваться шаблоном из моей статьи то этого вполне хватит для 90% случаев.
Вот это важное замечание. Не я делал тот объект, не знаю. А если в layoutе поле обязательно, а на объекте нет, то в схеме объектов и связей, это поле будет помечено красной чертой, как обязательное? Наверное нет.
Вот еще непонятный для меня вопрос:
Если в записи есть лук-ап поле (для которого нужен ID из другого объекта) и это поле обязательно, то при создании временной тестовой записи что записывать в это поле? Произвольной набор цифр и букв нужной длины? Или нужно создать все связанные записи?
Спасибо за статью, выглядит очень хорошо, завтра буду читать. На developer много хорошей информации и отличных workbookов, но не всегда получается найти то, что нужно. Например, ясную информацию о том как заставить работать Портал, я нашел только в вашей статье.
Привет вот и мои комментарии
Не будет.
Небольшое разъяснение: Lookup - это поле связи НЕОБЯЗАТЕЛЬНОЕ, Master-Details - поле связи ОБЯЗАТЕЛЬНОЕ. Если в объекте lookup то заполнять его не нужно (если в этом нет необходимости). Произвольный набор цифр и букв НЕЛЬЗЯ записать в поля связи. ТОЛЬКО сгенерированный ID на этапе insert объекта в базу, т.е. НУЖНО создать и ЗАПИСАТЬ в базу объект, на который ты будешь ссылаться.
Согласен, сам до многих вещей дохожу практическим путем. Просто американцы так глубоко в программирование на SF не лезут, и портал так использовать наверное не многие догадываются. Salesforce это не язык программирования - это для многих готовый продукт, который можно использовать из коробки, ну максимум намного изменив стандартную логику.