Я не смог получить какую-либо достоверную информацию об этой проблеме в Интернете. Но я думаю, что это должна быть проблема, которая должна затрагивать многих людей.
По сути, я написал простой триггер и тестовый класс в песочнице, протестировал его и, когда все было в порядке, развернул его в PRD.
Сначала я попробовал режим проверки и получил эту ошибку.
System.LimitException: Слишком много запросов SOQL: 101
Было показано, что эта ошибка возникает в каком-то другом тестовом классе. Итак, я чувствую, что тестовые случаи в моем триггере выполнялись, и это в сочетании с оставшимися тестовыми примерами каким-то образом превысило предел.
Таким образом, общее количество запросов SOQL в наших модульных тестах должно быть меньше 100. Это немного сложно соблюдать, верно? Я могу себе представить, что с таким количеством тестовых случаев нам наверняка понадобится более 100 запросов.
Так как же избежать превышения этого предела, поскольку Salesforce выполняет все тестовые случаи при развертывании даже одной строки кода.
У меня нет обычных подозреваемых... таких как SOQL в цикле for.
ОБНОВЛЕНИЕ: 19 августа 2012 г.: сейчас я публикую исходный код тестового класса и триггера
Тестовый класс:
@isTest
частный класс TestAccountDuplicateWebsiteTrigger {
static testMethod void myUnitTest() {
try{
// TO DO: implement unit test
Test.startTest();
Account a1;
a1 = new Account();
a1.name = 'GMSTest';
a1.Website = 'www.test.com';
Account a2;
a2 = new Account();
a2.name = 'GMSTest2';
a2.Website = 'www.test.com';
Account a3;
a3 = new Account();
a3.name = 'GMSTest3';
a3.Website = 'www.test1.com';
insert a1;
insert a2;
//insert a3;
Test.stopTest();
}
catch (Exception e)
{
}
}
}
Триггер
trigger osv_unique_website_for_account on Account (before insert, before update) {
//Map which has no duplicates with website as the key
Map<String, Account> accountMap = new Map<String, Account>();
for (Account account: System.Trigger.new)
{
//Ensure that during an update, if an website does not change - it should not be treated as a duplicate
if ((account.Website != null) && (System.Trigger.isInsert ||
(account.Website != System.Trigger.oldMap.get(account.Id).Website)))
{
//check for duplicates among the new accounts in case of a batch
if (accountMap.containsKey(account.Website))
{
account.Website.addError('Cannot save account. Website already exists.');
}
else
{
accountMap.put(account.Website, account);
}
}
}
//Now map containing new account websites has been created.
//Check them against the account websites that ALREADY EXIST in salesforce. If website exists, display error.
for (Account account : [SELECT Website FROM Account WHERE Website IN :accountMap.KeySet()])
{
Account newAccount = accountMap.get(Account.Website);
if (newAccount!=null)
{
newAccount.Website.addError('Cannot save account. Website already exists.');
}
}
}
Не могли бы вы поделиться своими мыслями?
Спасибо,
Кальвин