У меня есть два разных запланированных класса, которые я пытаюсь запланировать из одного тестового класса. Упрощение: первый класс создает набор записей, а затем второй класс делает с этими записями что-то еще.

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

Сначала Когда я запланировал задание с помощью String jobId = System.schedule('ScheduledApexTest',CRON_EXP, new exampleClass());, а затем остановил тест с помощью Test.stopTest();, ничего не происходит. TimesTriggered остается равным 0. Это отдельная проблема, но я тестировал ее, используя приведенный ниже метод.

test.startTest();

SchedulableContext sc;
exampleClass1 EC1 = new exampleClass1();
EC.execute(sc);

SchedulableContext sc2;
exampleClass2 EC2 = new exampleClass2();
EC2.execute(sc2);

test.stopTest();

По какой-то причине, когда я это делаю, кажется, что exampleClass1 запускается дважды, а exampleClass2 не запускается. Я также пытался использовать только один запланированный контекст в обоих вызовах, но это дает аналогичную ошибку.

Каждый из них работает сам по себе, но когда я делаю оба вместе, это ведет себя странно. Это то, что можно сделать, или мне просто нужно сделать это в двух разных тестовых классах?

0
denvergreene 12 Авг 2021 в 01:14
Делегируют ли методы execute() работу дальнейшим асинхронным транзакциям? Вышеупомянутое должно работать нормально
 – 
cropredy
12 Авг 2021 в 01:40
Почему бы вам не протестировать их отдельно?
 – 
Adrian Larson
12 Авг 2021 в 02:37
Мой первый запланированный класс — это пользовательское преобразование лидов, а второй создает возможности на основе полей лидов и контактов. Я хотел, чтобы тестовые записи для OPP Builder точно отражали то, что было создано из ведущего преобразователя. Но я не хотел помещать весь преобразователь свинца в тестовый класс, и я изо всех сил пытаюсь сослаться на него по тем же причинам, что и выше.
 – 
denvergreene
12 Авг 2021 в 19:12

1 ответ

На самом деле вы можете протестировать только одну асинхронную вещь в модульном тесте. Используйте два модульных теста. Оба метода модульных тестов могут быть в одном классе, и вы можете использовать @TestSetup, если хотите настроить данные, общие для обоих тестов, чтобы сохранить ограничения времени выполнения/регулятор. Если вы решите использовать @TestSetup, имейте в виду, что @TestSetup съест ограничения регулятора модульного тестирования, если вы не вызовете Test Сначала .startTest(), так что обязательно сделайте это.

1
sfdcfox 12 Авг 2021 в 02:57
Когда я пытаюсь это сделать, я получаю сообщение об ошибке: «Из тестового метода можно вызвать не более одного executeBatch». В документации обычно говорится, что это происходит при наличии более 200 записей в пакете, но здесь это определенно не так, поэтому я думаю, что каждый класс, который можно пакетировать, теперь также является проблемой.
 – 
denvergreene
12 Авг 2021 в 21:43
Это также может произойти, если два пакета вызываются в одном и том же методе тестирования. Их нужно вызывать в отдельных модульных тестах.
 – 
sfdcfox
12 Авг 2021 в 22:11