Мне нужно написать модульный тест для некоторой бизнес-логики, которая происходит после того, как поле Contact IsEmailBounced = true. Однако поле недоступно для записи. Мой вопрос: как создать тестовый контакт с IsEmailBounced = true?

///обновление Я использовал JSON.deserialize для значения IsEmailBounced. Но, похоже, он не сохраняется, когда я обновляю значение для передачи в триггер. Когда контактная запись попадает в контакт, бизнес-логика отображается как IsEmailBounced = false;

Метод испытания

@IsTest
    static void contactHardBounceTest() {
        Contact c = [
                SELECT Id, IsEmailBounced
                FROM Contact
                LIMIT 1
        ];
        Contact bouncedContact = (Contact) JSON.deserializeStrict(
                '{"IsEmailBounced" : "true"}',
                Contact.class);
        bouncedContact.Id = c.Id;
        System.assertEquals(true, bouncedContact.IsEmailBounced);
        System.debug('bounced contact id ' + bouncedContact.Id);
        System.debug('bounced contact email status ' + bouncedContact.IsEmailBounced);

        update bouncedContact;
        CampaignMember updatedMember = [
                SELECT Id, Status
                FROM CampaignMember
                WHERE ContactId = :bouncedContact.Id
                LIMIT 1
        ];
        System.assertEquals('Bounced', updatedMember.Status, 'Failed assertion on updated member status');
    }

Бизнес логика

public static void updateContacts(List<Contact> newContacts,  Map<Id, Contact> oldContacts){
        List<Contact> unsubContacts = new List<Contact>();
        List<Contact> bouncedContacts = new List<Contact>();
        for(Contact c : newContacts){
            System.debug('Contact Id ' + c.Id);
            System.debug('Email Status in loop ' + c.IsEmailBounced);
            Contact oldContact = oldContacts.get(c.Id);
            if(c.HasOptedOutOfEmail == true && oldContact.HasOptedOutOfEmail == false){
                unsubContacts.add(c);
            }if(c.IsEmailBounced == true){
                bouncedContacts.add(c);
            }
        }
        if(!unsubContacts.isEmpty()){
            updateUnSubCMStatus(unsubContacts);
        }
        if (!bouncedContacts.isEmpty()) {
            updateBouncedCMStatus(bouncedContacts);
        }
    }
3
Brooks Johnson 22 Авг 2019 в 21:32

1 ответ

Лучший ответ

Часто, когда вам нужно протестировать поля, которые не доступны для записи, сериализация обеспечивает хороший обходной путь.

Contact record = (Contact)JSON.deserialize(JSON.serialize(new Map<String, Object> {
    'IsEmailBounce' => true
}, Contact.class);
MyService.doSomething(record);
3
Adrian Larson 22 Авг 2019 в 19:32
Адриан, спасибо, посмотрю. Я мало использовал сериализацию.
 – 
Brooks Johnson
22 Авг 2019 в 19:35
Я обновил исходный вопрос. Я смог использовать JSON для установки поля IsEmailBounced, но, похоже, он не сохраняется после того, как я вызываю обновление для него.
 – 
Brooks Johnson
22 Авг 2019 в 21:33
1
Тот факт, что вы можете создать запись в памяти, не означает, что вы можете обновить ее с помощью полей, недоступных для записи... Вам нужно просто вызвать свою службу с этой записью.
 – 
Adrian Larson
22 Авг 2019 в 21:34
Понял, спасибо Адриан.
 – 
Brooks Johnson
22 Авг 2019 в 21:37
И испытания прошли!!
 – 
Brooks Johnson
22 Авг 2019 в 21:44