Подключить контроллер к приложению динамически

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Подключить контроллер к приложению динамически

Сообщение nickdenry »

Всем привет!

Возможно ли динамически создать контроллер и подключить его к приложению?

т.е.

Код: Выделить всё

<?php
namespace some\module;
use Yii;
use yii\web\Controller;

class TestController extends Controller
{
    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'some' => [
                'class' => SomeAction::class,
                'modelClass' => SomeeModel::class,
            ],
        ];
    }
}
и в другом месте (тест)

Код: Выделить всё

$controller = new TestController('test', Yii::$app, []);
Yii::$app->controller = $controller;
При попытке обращения к 'test/some' выдает

Код: Выделить всё

 
 $I->sendAjaxPostRequest(['test/some'], ['id' => $this->_model->id]);
 Unable to resolve the request "test/toggle"

UPD. Протестировать нужно action в модуле.
Ответственные программисты с высоким уровнем технического долга (c)
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: Подключить контроллер к приложению динамически

Сообщение nickdenry »

Админы, перенесите в тестирование, пожалуйста, м.б. там ответят.
Ответственные программисты с высоким уровнем технического долга (c)
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Подключить контроллер к приложению динамически

Сообщение maleks »

Да дело в том что страницы("экшен") тестируются функциональными или приемочными тестами.
Если у вас там в экшене бизнес логика, то лучше ее оттуда перенести в сервисы и уже их тестировать.
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: Подключить контроллер к приложению динамически

Сообщение nickdenry »

Это и есть кусочек функционального теста. Бизнес-логики в экшене нет. Хочу провести "изолированное" тестирование, не из приложения (backend/frontend например), а непосредственно из модуля, инициализировав приложение самостоятельно.

Саму идею взял отсюда - https://github.com/yii2mod/yii2-toggle- ... stCase.php

Правда, здесь как-раз Action тестируется Unit-тестом, для runAction такой инициализации достаточно.


В моем случае, очевидно, не достаточно, т.к. инициализированное приложение ничего не знает о динамически созданном контроллере.
А я как раз хочу функциональным, т.е. экшен берет параметры из post, которые автоматические не биндятся и передать их можно только эмулируя $_POST, чего не хочется.
Последний раз редактировалось nickdenry 2018.03.21, 20:30, всего редактировалось 3 раза.
Ответственные программисты с высоким уровнем технического долга (c)
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: Подключить контроллер к приложению динамически

Сообщение nickdenry »

В идеале что-то типа

Код: Выделить всё

<?php

class ToggleActionCest
{
    public function _before(\FunctionalTester $I)
    {
        $this->initDb();
        $this->initApp();
    }

    public function _after(\FunctionalTester $I)
    {
    }
    
    // tests
    public function tryToTest(\FunctionalTester $I)
    {
        $actionUrl = Url::toRoute(['test/some']);
        $I->sendAjaxPostRequest($actionUrl, ['id' => $this->_model->id]);
        /* Response checks */
    }
}
А изолированно хочется сделать, т.к. если я правильно понимаю, при тестировании компонента тесты не должны ничего знать о приложении, к которому подключены, какие настройки в backend/frontend и т.д., как в примере выше.
Ответственные программисты с высоким уровнем технического долга (c)
Ответить