Salesforce - модульное тестирование пользовательских полей для объекта Account - PullRequest
0 голосов
/ 25 июня 2018

Предположим, в Account объекте, он имеет 3 пользовательских поля, есть invoice_delivery_method, invoice_delivery_email и invoice_delivery_print.Для invoice_delivery_method типом является список выбора, и возможными значениями являются Email, Email and Print, Print и Other.Остальные два настраиваемых поля имеют флажок и по умолчанию не отмечены, что составляет false.

Теперь, когда пользователь обновляет поле invoice_delivery_method до Email (либо на странице учетной записи Salesforce, либо на SOQL)invoice_delivery_email установлен на true, а invoice_delivery_print установлен на false.

Я создал класс триггера следующим образом:

trigger InvoiceDeliveryMethodTrigger on Account (before update) {
    InvoiceDeliveryMethodTriggerHandler.handleBeforeUpdate(Trigger.new);
}

Внутри класса обработчика я сделал следующее:

public class InvoiceDeliveryMethodTriggerHandler {
    public static void handleBeforeUpdate(Account[] accounts){
        RecordType recordType = [select Id from RecordType where sobjecttype = 'Account' and Name =: MSSP_Settings__c.getOrgDefaults().Account_Record_Type__c];  
        for (Account account : accounts) {
            if(account.RecordTypeId == recordType.Id) {
                System.debug('Information for Account: ' + account);
                System.debug('Information for Invoice Delivery Method: ' + account.Invoice_Delivery_Method__c);
                account.Invoice_Delivery_Email__c = false;
                account.Invoice_Delivery_Print__c = false;
                String delivery_method = account.Invoice_Delivery_Method__c;
                System.debug('String is not blank ' + String.isNotBlank(delivery_method));
                if (String.isNotBlank(delivery_method)){
                    if (delivery_method.equals('Email')){
                        account.Invoice_Delivery_Email__c = true;
                        account.Invoice_Delivery_Print__c = false;
                    }
                    else if (delivery_method.equals('Email and Mail')){
                        account.Invoice_Delivery_Email__c = true;
                        account.Invoice_Delivery_Print__c = true;
                    }
                    else if (delivery_method.equals('Mail')){
                        account.Invoice_Delivery_Email__c = false;
                        account.Invoice_Delivery_Print__c = true;                   
                    }  
                }
            }
        }
    }
}

У меня также есть один класс триггера на Account после обновления, но я не изменил никакого значения для этого 3 настраиваемого поля.

Если я тестирую через приложение, кажется, что два настраиваемых поля обновляются на основе значения invoice_delivery_method.Но у меня возникли проблемы с моим модульным тестированием.

Вот класс написанного мной модульного теста

    @isTest
    private class InvoiceDeliveryMethodTest {
        @isTest(SeeAllData=true)
        static void testAccountEmailSelected(){
            Account testAccount = new Account();
            // populating some of the mandatory field for Account
            testAccount.Invoice_Delivery_Method__c = 'Other';
            insert testAccount;        


            Account acct = [Select Id, Invoice_Delivery_Method__c, Invoice_Delivery_Email__c, Invoice_Delivery_Print__c from Account 
                            where Id =: testAccount.Id];
            acct.Invoice_Delivery_Method__c = 'Email';
            update acct;
            acct = [Select Id, Invoice_Delivery_Method__c, Invoice_Delivery_Email__c, Invoice_Delivery_Print__c from Account 
                    where Id =: testAccount.Id];    
            System.assertEquals('Email', acct.Invoice_Delivery_Method__c);
            System.assert(acct.Invoice_Delivery_Email__c);
            System.assert(!acct.Invoice_Delivery_Print__c);
            delete testAccount;

        }
}

Когда я запускаю тестовый пример, он терпит неудачу на System.assert(acct.Invoice_Delivery_Email__c);

Это поля все еще false.Почему это случилось?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

OK.Я понял.Вот как я это сделал.

Сначала удалите все seealldata=true в аннотации isTest.

Затем в соответствии с http://sfdcsrini.blogspot.com/2014/07/how-to-readcreate-record-types-in-apex.html, я создаю метод setup с@testSetup для создания Account данных и recordType.

В методе тестирования я выбираю учетную запись, созданную в setup(), изменяю значение для invoice_delivery_method и обновляю учетную запись.Затем снова выберите и выполните проверку подтверждения.После того, как пройдена вся проверка подтверждения, удалите этот объект учетной записи, чтобы у него оставался только 1 объект учетной записи для использования в следующем методе тестирования.

0 голосов
/ 26 июня 2018

Прежде всего, я думаю, что более простым решением может быть использование формул вместо триггера.

Если вы все еще хотите пойти по триггерному маршруту, я бы посоветовал не использовать seealldata.

Тем не менее, единственное, о чем я могу думать, это тип записи.Можете ли вы утверждать, что при создании учетной записи тип записи Id соответствует ожидаемому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...