Чтобы проверить проводку вашего контроллера, используйте следующий код:
Мы начинаем t/pages.t
со знакомой информации.
use Mojolicious;
use Test::More;
Теперь создайте подкласс тестирования SampleApp::Pages
который записывает вызовы render
.
package TestingPages;
use Mojo::Base 'SampleApp::Pages';
has 'render_called';
has 'render_arg';
sub render {
my($self,%arg) = @_;
$self->render_called(1);
$self->render_arg({ %arg });
}
Ваш вопрос использовался Test::Class
, поэтому продолжайте эту тему.
package Test::SampleApp::Pages;
use base 'Test::Class';
use Test::More;
Обратите внимание, что die
без аргументов распространяется больше всегонедавнее исключение, поэтому вам не нужно явно писать $@
.
sub startup : Test(startup) {
eval { require SampleApp::Pages; SampleApp::Pages->import; 1 } or die;
}
В setup
создать экземпляр подкласса тестирования, подключить его к экземпляру Mojolicious и отключить ведение журнала.
sub setup : Test(setup) {
my($self) = @_;
my $c = TestingPages->new(app => Mojolicious->new);
$c->app->log->path(undef);
$c->app->log->level('fatal');
$self->{controller} = $c;
}
В домашнем тесте вызовите метод контроллера home
и проверьте результаты.
sub home : Tests(2) {
my($self) = @_;
my $c = $self->{controller};
$c->home;
is $c->render_called, 1, "render called";
is $c->render_arg->{title}, "Home", "correct title arg";
}
Наконец, запустите свои тесты.
package main;
Test::SampleApp::Pages->runtests;
Вывод:
$ ./sampleapp.pl test
Running tests from '/tmp/sampleapp/t'.
t/pages.t .. ok
All tests successful.
Files=1, Tests=2, 1 wallclock secs ( 0.03 usr 0.02 sys + 0.24 cusr 0.03 csys = 0.32 CPU)
Result: PASS
Теперь, когда вы видите, как это сделать, возникает вопрос, стоит ли это всех усилий.Контроллеры должны быть простой проводки.Подумайте, действительно ли какая-либо сложность в контроллере относится к модели, в которой тестирование гораздо проще.