Регистрация  |  Вход

Сообщения на VF странице и их проверка

Неработает:

@isTest
static void lostStageTest() {
MCD_Opportunity_Close_New_Controller controller = validInit();
System.assert(!ApexPages.hasMessages(), 'No errors should be so far');
controller.status = 'Closed Lost';
controller.getCompetitors(); // is invoked when it is shown on a closure page
controller.submit();
System.assert(ApexPages.hasMessages(), 'The page should display a bunch of errors');
System.assertEquals('None', controller.winnerId);

System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest ---'
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
+'\n'
);

// all fields are properly set here
controller.submit();
System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest - 2 ---'
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
+'\n'
);
System.assert(!ApexPages.hasMessages(), 'The page should NOT display any error');

}

Работает:
@isTest
static void lostStageTest() {
MCD_Opportunity_Close_New_Controller controller = validInit();
System.assert(!ApexPages.hasMessages(), 'No errors should be so far');
controller.status = 'Closed Lost';
controller.getCompetitors(); // is invoked when it is shown on a closure page
/*controller.submit();
System.assert(ApexPages.hasMessages(), 'The page should display a bunch of errors');
System.assertEquals('None', controller.winnerId);*/

System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest ---'
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
+'\n'
);

// all fields are properly set here
controller.submit();
System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest - 2 ---'
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
+'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
+'\n'
);
System.assert(!ApexPages.hasMessages(), 'The page should NOT display any error');

}

Т.е. поля я позже правильно назначаю и все нормально отрабатывает. Но вот, если первый раз я не выставил поля, то появляются сообщения с ошибками. Хорошо. Но когда все выставил, то они НЕ ИСЧЕЗАЮТ.
В какой момент СФ их сбрасывает? Как мне их в тесте сбросить?

Неработает:
[code]  @isTest
  static void lostStageTest() {
    MCD_Opportunity_Close_New_Controller controller = validInit();
    System.assert(!ApexPages.hasMessages(), 'No errors should be so far');
    controller.status = 'Closed Lost';
    controller.getCompetitors(); // is invoked when it is shown on a closure page
    controller.submit();
    System.assert(ApexPages.hasMessages(), 'The page should display a bunch of errors');
    System.assertEquals('None', controller.winnerId);
    
System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest ---'
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
  +'\n'
);
    
    // all fields are properly set here
    controller.submit();
System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest - 2 ---'
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
  +'\n'
);
    System.assert(!ApexPages.hasMessages(), 'The page should NOT display any error');
    
  }[/code]
Работает:
[code]  @isTest
  static void lostStageTest() {
    MCD_Opportunity_Close_New_Controller controller = validInit();
    System.assert(!ApexPages.hasMessages(), 'No errors should be so far');
    controller.status = 'Closed Lost';
    controller.getCompetitors(); // is invoked when it is shown on a closure page
    /*controller.submit();
    System.assert(ApexPages.hasMessages(), 'The page should display a bunch of errors');
    System.assertEquals('None', controller.winnerId);*/
    
System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest ---'
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
  +'\n'
);
    
    // all fields are properly set here
    controller.submit();
System.debug(LoggingLevel.ERROR, '\n\n\n --- lostStageTest - 2 ---'
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages().size()
  +'\n - ApexPages.getMessages(): ' + ApexPages.getMessages()
  +'\n'
);
    System.assert(!ApexPages.hasMessages(), 'The page should NOT display any error');
    
  }[/code]

Т.е. поля я позже правильно назначаю и все нормально отрабатывает. Но вот, если первый раз я не выставил поля, то появляются сообщения с ошибками. Хорошо. Но когда все выставил, то они НЕ ИСЧЕЗАЮТ.
В какой момент СФ их сбрасывает? Как мне их в тесте сбросить?

ApexPages.getMessages().clear(); - неработает
Add support for clearing PageMessages via Apex

ApexPages.getMessages().clear(); - неработает
[url=https://success.salesforce.com/ideaView?id=08730000000ZLADAA4]Add support for clearing PageMessages via Apex[/url]

Chiz
ApexPages.getMessages().clear(); - неработает

ну наверное для начала стоит использовать test.StartTest() и test.StopTest()

[quote="Chiz"]ApexPages.getMessages().clear(); - неработает[/quote]

ну наверное для начала стоит использовать test.StartTest() и test.StopTest()

wilder
для начала стоит использовать test.StartTest() и test.StopTest()
Как это должно помочь?

[quote="wilder"]для начала стоит использовать test.StartTest() и test.StopTest()[/quote]Как это должно помочь?

А есть вообще способ очистить очередь ApexPages.Message? Насколько я помню (тоже сталкивался с этой задачей) такой возможности нет и в IdeaExchange есть только предложения с добавлением этого функционала в Salesforce.
Когда я делал, то в тестах приходилось просто создавать новые тест методы чтобы протестировать новые состояния, потому что если в коде добавил ApexPages.Message то через apex очередь не очистишь.

А есть вообще способ очистить очередь ApexPages.Message? Насколько я помню (тоже сталкивался с этой задачей) такой возможности нет и в IdeaExchange есть только предложения с добавлением этого функционала в Salesforce.
Когда я делал, то в тестах приходилось просто создавать новые тест методы чтобы протестировать новые состояния, потому что если в коде добавил ApexPages.Message то через apex очередь не очистишь.

Dmitry Shnyrev
А есть вообще способ очистить очередь ApexPages.Message? Насколько я помню (тоже сталкивался с этой задачей) такой возможности нет и в IdeaExchange есть только предложения с добавлением этого функционала в Salesforce.
Когда я делал, то в тестах приходилось просто создавать новые тест методы чтобы протестировать новые состояния, потому что если в коде добавил ApexPages.Message то через apex очередь не очистишь.

Вот я переделал это метод. И другой, который, все ошибки проверял, т.к. я не уверен, что там все правильно проходит, ибо все ошибки свалились и не вываливаются. Ну и проверки будут всегда проходить, т.к. я проверяю только НАЛИЧИЕ определенной ошибки и не проверяю ОТСУТСТВИЕ других.

[quote="Dmitry Shnyrev"]А есть вообще способ очистить очередь ApexPages.Message? Насколько я помню (тоже сталкивался с этой задачей) такой возможности нет и в IdeaExchange есть только предложения с добавлением этого функционала в Salesforce.
Когда я делал, то в тестах приходилось просто создавать новые тест методы чтобы протестировать новые состояния, потому что если в коде добавил ApexPages.Message то через apex очередь не очистишь.[/quote]
Вот я переделал это метод. И другой, который, все ошибки проверял, т.к. я не уверен, что там все правильно проходит, ибо все ошибки свалились и не вываливаются. Ну и проверки будут всегда проходить, т.к. я проверяю только НАЛИЧИЕ определенной ошибки и не проверяю ОТСУТСТВИЕ других.

Чисто из любопытства - а какая, по-вашему, страница находится в контексте выполнения этого теста? По-моему вы забыли Test.setCurrentPage вызвать.

Чисто из любопытства - а какая, по-вашему, страница находится в контексте выполнения этого теста? По-моему вы забыли Test.setCurrentPage вызвать.