Появилась такая задача -
протестировать кусок кода, в котором выборка из базы "старых" Contact (созданных скажем день назад). Выборка ведется по CreatedDate < DateTime.now().addDays(-1)
Как мне в тестах воссоздать данную ситуацию. Заполнение поля CreatedDate невозможно - получается ошибка "Field is not writeable: Contact.CreatedDate"
Не думаю что я первый столкнулся с такой задачей.
Вот тут нашел пару примеров как решать это проблему
Unit testing code which has logic around the CreatedDate
Но хотелось бы услышать ваше мнение.
Вот нашел даже статью на эту тему от наших белорусских коллег
EDIT CREATED DATE FIELD IN SALESFORCE
Но по ходу все эти костыли не позволяют записать все это в базу, а посему все это плохо подходит для проверки моего кода (без дополнительных костылей для тестов)
Быть может стоит метод переделать, избавиться в нём от зависимости, передав дату в аргумент.
К примеру, вот есть метод:
public static List<Contact> getOldContacts(){
DateTime dateTime = DateTime.now().addDays(-1);
return [SELECT id FROM Contact WHERE CreatedDate < : dateTime];
}В тестах этот метод ничего не вернёт, но можно ведь сделать так:
public static List<Contact> getOldContacts(DateTime dateTime){
return [SELECT id FROM Contact WHERE CreatedDate < : dateTime];
}Куда более универсальный метод, не так ли?)
Проблемы тестирования возникают из-за сильной связанности кода.
Всем DRY
"Переделать" для моего случая
точно не вариант. Код у меня и так покрывается за счет других условий. Хотелось записать "человеческие" тесты чтобы воссоздать реальную ситуацию. Но получается проще забить на этот use case чтобы не ломать красивый код
Получается вот такой большой камень в огород sf.