Установка корректного InvokeArg при выполнении контроллера Платформы Зенда в ремне безопасности Zend_Test

Я не полагаю, что возможно автовекторизовать код обычно полезным способом, и фасет функционального программирования F# чрезвычайно не важен в этом контексте.

самая трудная проблема не обнаруживает, когда можно выполнить подвычисления параллельно, она определяет, когда это не ухудшит производительность, т.е. когда подзадачи будут брать достаточно долго для вычисления этого, стоит получить удар производительности параллельной икры.

Мы исследовали это подробно в контексте научных вычислений, и мы приняли гибридный подход в нашем F# для библиотеки Numerics. Наши параллельные алгоритмы, положился на Библиотеку Параллели Задачи Microsoft, потребуйте дополнительного параметра, который является функцией, дающей предполагаемую вычислительную сложность подзадачи. Это позволяет нашей реализации избегать чрезмерного подразделения и гарантировать оптимальную производительность. Кроме того, это решение идеально для языка программирования F#, потому что параметр функции, описывающий сложность, обычно является анонимной первоклассной функцией.

С наилучшими пожеланиями, Jon Harrop.

5
задан Ivan Krechetov 4 August 2009 в 14:42
поделиться

2 ответа

Редактировать: Извините, я пропустил эту часть вашего вопроса в первый раз (кофе еще нет!). Я отредактировал ответ.

Проблема заключается в том, что Zend_Test_PHPUnit_ControllerTestCase предназначен для контроллеров модульного тестирования. Он пытается использовать очень мало зависимостей от остальной части фреймворка, и он НЕ запускает автоматически / bootstrap / что-то еще (и не знает) ваше более крупное приложение.

В основном, getResouce не работает, потому что ваш загрузочный файл не существует.

Если вы посмотрите вокруг Zend_Test_PHPUnit_ControllerTestCase , вы увидите, что он вручную настраивает и использует Zend_Controller_Front , и инициализирует свои собственные объекты запроса / ответа для каждого теста. Это' s попытка быть как можно больше модульным тестом , а не функциональным или интеграционным тестом.

Чтобы решить вашу проблему, вы должны указать тестовой системе , как выполнить загрузку ваше приложение. Есть несколько способов добиться этого.

Во-первых, вы можете назначить файл общедоступному свойству bootstrap тестового класса.

public $bootstrap = '/path/to/bootstrap/file.php'

Это хороший вариант для приложений, использующих Zend_Application .

Или, предоставив обратный вызов свойству bootstrap :

public function setUp()
{
    // Use the 'start' method of a Bootstrap object instance:
    $bootstrap = new Bootstrap('test');
    $this->bootstrap = array($bootstrap, 'start');
    parent::setUp();
}

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

Редактировать 2: Хорошо , вы фактически загружаете свое приложение. Итак, вы сделали это, но все равно не повезло.

Я бы порекомендовал переопределить метод dispatch TestCase, чтобы убедиться, что он получает начальную загрузку. (Это наверняка сработает).

public function dispatch($url = null)
{
    $this->getFrontController()->setParam('bootstrap', $yourBootstrap);
    parent::dispatch($url);
}

Если подумать, вы, вероятно, могли бы сделать это и в setUp .

Это позволит набору тестов правильно имитировать поведение фронт-контроллер, созданный Zend_Application . Оба метода доступа к начальной загрузке теперь должны работать.

4
ответ дан 18 December 2019 в 14:49
поделиться

Я столкнулся с той же проблемой при использовании подключаемого модуля контроллера, которому требовалась начальная загрузка.

В основном я создавал абстрактный класс и унаследовал от него.


abstract class My_ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    protected $application;

    public function setUp()
    {


        $this->bootstrap = array($this, 'appBootstrap');


        return parent::setUp();
    }

    public function appBootstrap()
       {

        $this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/app.ini');

        $this->application->bootstrap();

        $bootstrap = $this->application->getBootstrap();

        $front = $bootstrap->getResource('FrontController');

        $front->setParam('bootstrap', $bootstrap);

       }
}

Затем вы используете следующее:


class MyControllerTest extends My_ControllerTestCase
{

}

Я также зарегистрировал запрос, чтобы эта функция стала частью ZF

[ZF-7373]: ( http://framework.zend.com/issues/browse/ZF-7373 ) -

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

9
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: