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

Тестирование контроллера: как в конструктор "передать" GET параметр?

Всем привет!

как известно , тестирование - это особая тема, а тестирование контроллеров имет свои особенности.

Тестирую один контроллер "по-простому": создаю объект-контроллер, вызываю его методы, проверяю Ассертом УРЛ, если метод делает редирект.

но у контроллера есть конструктор, в нем получается GET параметр, при его наличии делается квери и еще пару строк.
но как в конструктор "передать" GET параметр? я думаю, что это никак не получится сделать "по-простому".

нужно создавать страницу. дописал в юнит-тест следующее:

PageReference tpageRef = Page.MyPage;

Test.setCurrentPage(tpageRef);

ApexPages.currentPage().getParameters().put('id', Account.id);

в надежде, что эти строки спровоцируют создание нового контроллера с передачей в конструктор параметра, но нет: покрытие не изменилось.

Как это делается "по-уму"?

Всем привет!

как известно , тестирование - это особая тема, а тестирование контроллеров имет свои особенности.

Тестирую один контроллер "по-простому": создаю объект-контроллер, вызываю его методы, проверяю Ассертом УРЛ, если метод делает редирект.

но у контроллера есть конструктор, в нем получается GET параметр, при его наличии делается квери и еще пару строк.
но как в конструктор "передать" GET параметр? я думаю, что это никак не получится сделать "по-простому".

нужно создавать страницу. дописал в юнит-тест следующее:
[code]
    PageReference tpageRef = Page.MyPage;
    
    Test.setCurrentPage(tpageRef);

    ApexPages.currentPage().getParameters().put('id', Account.id);
[/code]

в надежде, что эти строки спровоцируют создание нового контроллера с передачей в конструктор параметра, но нет: покрытие не изменилось.

Как это делается "по-уму"?


Не уверен что currentPage() правильно отработает в тесте, я обычно делаю просто

PageReference tpageRef = Page.MyPage;
tpageRef.getParameters().put('id', Account.id);

Не уверен что currentPage() правильно отработает в тесте, я обычно делаю просто

[code]PageReference tpageRef = Page.MyPage;
tpageRef.getParameters().put('id', Account.id);[/code]

Дмитрий Черник
Не уверен что currentPage() правильно отработает в тесте, я обычно делаю просто

PageReference tpageRef = Page.MyPage;
tpageRef.getParameters().put('id', Account.id);

спасибо, выглядит получше.

попробовал в тесте - все равно в конструкторе пустой параметр - вижу что код не проходит дальше проверки на пустоту параметра.

[quote="Дмитрий Черник"]Не уверен что currentPage() правильно отработает в тесте, я обычно делаю просто

[code]PageReference tpageRef = Page.MyPage;
tpageRef.getParameters().put('id', Account.id);[/code][/quote]

спасибо, выглядит получше.

попробовал в тесте - все равно в конструкторе пустой параметр - вижу что код не проходит дальше проверки на пустоту параметра.

ApexPages.currentPage().getParameters().put('id', my_object.Id);

Вот эта 1 строка. Во всех тестах использую - работает 100%.

[code]ApexPages.currentPage().getParameters().put('id', my_object.Id);[/code]
Вот эта 1 строка. Во всех тестах использую - работает 100%.

Den Brown
в надежде, что эти строки спровоцируют создание нового контроллера с передачей в конструктор параметра

А с чего ты взял что это спровоцирует создание нового контроллера?
Вообще зачем в тестах использовать страницы и их выставлять как здесь Test.setCurrentPage(tpageRef);
Сколько работаю никогда этого не делал. Тестируется контроллер а не страница. А контроллеру по барабану есть страница или ее нет. Все методы контроллера можно дергать напрямую.
После того как добавил GET параметр (как я выше написал, в принципе тоже самое у тебя)
делаешь new своему контроллера и у инстанса устанавливаешь переменные и дергаешь методы. ВСЕ!

[quote="Den Brown"]в надежде, что эти строки спровоцируют создание нового контроллера с передачей в конструктор параметра[/quote]
А с чего ты взял что это спровоцирует создание нового контроллера?
Вообще зачем в тестах использовать страницы и их выставлять как здесь Test.setCurrentPage(tpageRef);
Сколько работаю никогда этого не делал. Тестируется контроллер а не страница. А контроллеру по барабану есть страница или ее нет. Все методы контроллера можно дергать напрямую.
После того как добавил GET параметр (как я выше написал, в принципе тоже самое у тебя)
делаешь new своему контроллера и у инстанса устанавливаешь переменные и дергаешь методы. ВСЕ!

Dmitry Shnyrev
После того как добавил GET параметр (как я выше написал, в принципе тоже самое у тебя)
делаешь new своему контроллера и у инстанса устанавливаешь переменные и дергаешь методы. ВСЕ!

точняк.

ApexPages.currentPage().getParameters().put('id', Acc.id);

My_Controller controller = new My_Controller();

провалился в конструктор как надо.

все дело в очередности строк. я не ставил

ApexPages.currentPage().getParameters().put('id', Acc.id);

перед вызовом контроллера, так как не видел прямой связи между currentPage и последующим созданием контроллера. А она есть...

[quote="Dmitry Shnyrev"]После того как добавил GET параметр (как я выше написал, в принципе тоже самое у тебя) 
делаешь new своему контроллера и у инстанса устанавливаешь переменные и дергаешь методы. ВСЕ![/quote]

точняк.

[code]    ApexPages.currentPage().getParameters().put('id', Acc.id);

My_Controller controller = new My_Controller();[/code]

провалился в конструктор как надо.

все дело в очередности строк. я не ставил 

[code]    ApexPages.currentPage().getParameters().put('id', Acc.id);[/code]

перед вызовом контроллера, так как не видел прямой связи между currentPage и последующим созданием контроллера. А она есть...