Создал триггер для обращения к внешнему ресурсу
Триггер:
trigger CreativeRequestRemoteUpdate on Creative_Request__c (after insert, after update, after delete) { String action;
Set<Id> crreqIds = new Set<Id>();
if (Trigger.isInsert) { action = 'insert'; crreqIds = Trigger.newMap.keySet(); }
if (Trigger.isUpdate) { action = 'update'; crreqIds = Trigger.newMap.keySet(); }
if (Trigger.isDelete) { action = 'delete'; crreqIds = Trigger.oldMap.keySet(); }
CreativeRequest_TriggerHelperNTM.updateCreativeRequest(action, crreqIds);
}
Класс:
public with sharing class CreativeRequest_TriggerHelperNTM { @future (callout=true)
public static void updateCreativeRequest (String action, Set<Id> crreqSetIds) {
List<Id> crreqListIds = new List<Id>(crreqSetIds);
String ids = String.join(crreqListIds, ',');
HttpRequest req = new HttpRequest();
req.setEndpoint('http://test.com/sf/remote/sf_query_1&token=fgkgwkugfwiuegf&act='+action+'&ids='+ids);
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());
}
}
При деплое на продакшин пишет что методы недостаточно покрыты тестом.
Читал Вашу статью http://salesforce-developer-rus.blogspot.com/2013/01/testing-apex-code.html
Но не понимаю как писать юнит тест в моем случае
Полагаю что начинать надо так:
@isTest
private static void testNtmTriggers() {
}
Ну вобщем думаю что как то так:
@isTest
private static void testNtmTriggers() {
// подготовка данных для тестирования
test.startTest();
// непосредственно тестирование (вызов методов, проверка возвращаемых данных)
test.stopTest();
}
Мне не очевидно какие данные готовить для тестирования и как вызывать сам тестируемый метод
Все очень просто. Чтобы покрыть триггер тестами надо инициировать запуск триггера.
Триггер запускается в результате работы DML операции (insert, update, delete, upsert)
Вот что надо сделать по шагам:
1. Создаем класс с названием по смыслу (например SomeTriggerTest.cls)
2. берем мой шаблон как есть (меняем только HelloTests на SomeTriggerTest):
@isTest
private class HelloTests {
static testMethod void Test1() {
Profile profile = [select id, Name from profile where name='System Administrator'];
User user = new User(alias = 'tt01', email='testtest01@test.com', emailencodingkey='UTF-8', lastname='testtest01', languagelocalekey='en_US', localesidkey='en_US', profileid = profile.Id, timezonesidkey='America/Los_Angeles', username='testtest01@test.com');
insert user;
System.RunAs(user){
// подготовка данных для тестирования
test.startTest();
// непосредственно тестирование (вызов методов, проверка возвращаемых данных)
test.stopTest();
}
}
}
3. В подготовку данных пока ничего не пишем ()
4. В "непосредственно тестирование" будем заносит все наше тестирование:
т.к. у нас в триггере указано что "on Creative_Request__c (after insert, after update, after delete)" то нужно инициировать три DML операции.
вот примерно что должно получиться в секции между test.startTest() и test.stopTest() (пишу напрямую без проверки компилятором, так что могут быть ошибки но нам главное уловить смысл):
Creative_Request__c obj = new Creative_Request__c (Name = 'Some name');
insert obj;
update obj;
delete ojb;
Собственно весь тест метод.
Теперь еще одно замечание:
при каждой DML операции в тест методе у тебя будет вызываться
CreativeRequest_TriggerHelperNTM.cls (future метод updateCreativeRequest)
В нем есть такая строчка
HTTPResponse res = http.send(req);
Это обращение к внешнему сервису.
В тест методах на этой строчке получишь исключение.
Чтобы тесты отработали без ошибок надо последние две строчки заменить на следующие:
if (!test.isRunnungTest){
HTTPResponse res = http.send(req);
System.debug(res.getBody());
}Рабочий юнит тест:
@isTest
private class CreativeRequest_TriggerHelperNTM_Tests {
static testMethod void Test1() {
Profile profile = [select id, Name from profile where name='System Administrator'];
User user = new User(alias = 'tt01', email='testtest01@test.com', emailencodingkey='UTF-8', lastname='testtest01', languagelocalekey='en_US', localesidkey='en_US', profileid = profile.Id, timezonesidkey='America/Los_Angeles', username='testtest01@test.com');
insert user;
System.RunAs(user){
test.startTest();Project__c obj_project = new Project__c (Name = 'test');
insert obj_project;Creative_Request__c obj = new Creative_Request__c (Name = 'test', Project__c = obj_project.Id, Completion_Time__c = DateTime.now());
insert obj;
update obj;
delete obj;test.stopTest();
}
}
}
Спасибо