この問題に関する信頼できる情報をオンラインで入手できませんでした。しかし、それは多くの人に影響を与えているに違いない問題だと思います。
基本的に、サンドボックスに簡単なトリガーとテスト クラスを作成してテストし、問題がなければ PRD にデプロイしました。
最初に検証モードを試したところ、このエラーが発生しました。
System.LimitException: SOQL クエリが多すぎます: 101
このエラーは、他のテスト クラスで発生することが示されました。そのため、トリガーのテスト ケースが実行され、これが残りのテスト ケースと相まって、何らかの形で制限を超えたように感じます。
したがって、単体テストの SOQL クエリの総数は 100 未満である必要があります。これは少し難しいですね。非常に多くのテスト ケースがあると想像できますが、100 以上のクエリが必要になることは間違いありません。
では、Salesforce は 1 行のコードをデプロイするだけでもすべてのテスト ケースを実行するため、この制限に達するのを回避するにはどうすればよいでしょうか。
通常の容疑者はいません... forループ内のSOQLのように。
更新: 2012 年 8 月 19 日: テスト クラスとトリガーのソース コードを投稿しています。
テスト クラス:
@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.');
}
}
}
あなたの考えを教えてください。
ありがとう、
カルバン