【问题标题】:Apex Trigger Works, can not get test passApex Trigger Works,无法通过测试
【发布时间】:2012-06-08 20:58:02
【问题描述】:

3 小时后我又回来了,没有对任何代码进行任何更改,测试执行工作正常。 无视这个问题

我编写了一个触发器,非常适合根据外部 ID 在联系人记录上设置 accountID。

我的测试效果很好,但我在触发器中添加了一些逻辑,因此它只更新使用“默认帐户”作为帐户的联系人。现在我的测试失败了,说它没有更新帐户,即使它在保存记录时仍然按设计工作。

我错过了什么?

我添加了第 4 行

ID DefaultAccID = [select ID from Account where Name = 'Default Account'].ID;

以及第 9 行附近的 if

if (contactNew.AccountID == DefaultAccID) {
}

触发:

trigger TRG_Contact_SetHouseholdID on Contact (before update, before insert) {
Set<String> AccIDlist = new Set<String>();
ID DefaultAccID = [select ID from Account where Name = 'Default Account'].ID;

// loop through records finding thoes that need to be linked
for(Contact contactNew:Trigger.New){
    if (contactNew.AccountID == DefaultAccID) {
        AccIDlist.add(contactNew.RPHouseholdID__c);
    }
}

Map<String, ID> AccountMap = new Map<String, ID>();

//loop needing linked and get account ID if it exist     
for(Account oneAccount:[SELECT RPHouseholdID__c, ID from Account where RPHouseholdID__c IN :AccIDlist]){
    AccountMap.put(oneAccount.RPHouseholdID__c, oneAccount.ID);
}

// loop through records updating the ones that need link
for(Contact contactNew:Trigger.New){
    if (AccountMap.get(contactNew.RPHouseholdID__c) <> null){
        contactNew.AccountID = AccountMap.get(contactNew.RPHouseholdID__c);
    }
}
}

测试类:

@isTest
Private class TRG_Contact_SetHouseholdID_Test {
static TestMethod void Test0_TestInsertWithValue(){
    insertTestAccounts();
    Account defaultAccount = [select ID from Account where name = 'Default Account' limit 1];
    Account newAccount = [select ID from Account where name = 'Camper Family' limit 1];
    test.startTest();
        insertTestContact(defaultAccount.ID);
    test.stopTest();
    Contact newContact = [select ID,AccountID from Contact where firstname = 'Happy' and lastname = 'Camper' limit 1];
    System.assertEquals(newContact.AccountID, newAccount.ID, 'accountID did not get changed from default (' + defaultAccount.ID + ')');
}

private static void insertTestAccounts()
{
    Account obj = new Account();
    obj.Name = 'Default Account';
    insert obj;
    obj = new Account() ;
    obj.Name = 'Camper Family';
    obj.RPHouseholdID__c = '111';
    insert obj;

}
private static void insertTestContact(ID defaultID)
{
    Contact obj = new Contact();
    obj.AccountID = defaultID;
    obj.firstName = 'Happy';
    obj.lastname = 'Camper';
    obj.RPHouseholdID__c = '111';
    insert obj;
}
}

【问题讨论】:

    标签: triggers salesforce apex-code


    【解决方案1】:

    扩展一点@zachelrath 的答案,从 API 版本 24.0 开始,测试方法与组织中的数据隔离(除了少数例外用户、记录类型等,请参阅here 以获取完整列表)。与其更改文件的 API 版本,最简单的做法是将查看所有数据指令添加到 isTest 注释中,如下所示:

    @isTest(SeeAllData=true)
    Private class TRG_Contact_SetHouseholdID_Test {
    // etc
    

    【讨论】:

    • 我以为测试数据是孤立的,但找不到确认。
    • 是的,它是 'Spring 12' 版本的新功能。我的答案中的链接有更多详细信息。
    • Triangle Man,@isTest(SeeAllData=true) 注释只存储 API 版本 24.0 及更高版本中的数据(请参阅here),因此您必须先更改 API 版本,然后再更改你的测试数据是自动孤立的,所以我看不出你的方法是如何“更容易”的,而事实上,如果他在 v23.0 中它根本不能解决问题(如果他使用的是默认情况下他会这样) Force.com IDE)。
    • @zachelrath 我没有从问题中看到任何迹象表明他们使用的是 Force.com IDE 或 API 版本 23.0,所以我认为他们使用的是当前版本 (24.0/25.0)。 @isTest(SeeAllData=true) 用于解除数据孤岛并将“默认帐户”公开给测试类。
    【解决方案2】:

    将您的测试类的 API 版本设置为 24.0 --- 我敢打赌,您对默认帐户的初始查询是在提取名称为“默认帐户”的预先存在的记录,而不是您正在创建的默认帐户你的测试数据。有两种方法可以解决这个问题:

    1. (最简单)将您的测试类更改为 API 版本 24.0
    2. 如果您希望使用 API 23.0 或更低版本,那么在您的测试方法开始时,删除所有名为“默认帐户”的帐户,然后插入您的测试帐户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2011-07-30
      相关资源
      最近更新 更多