В $ newJob у нас есть довольно большой проект Magento v1.9, в котором нет абсолютно никаких автоматических тестов. Все изменения были исторически проверены вручную, запустив локальную виртуальную машину с копией рабочей базы данных и просто нажав на нее. Мне дали разрешение на добавление модульных тестов, когда я пишу новый код, но так как большая часть логики бэкенда включает вызовы Mage::getModel()
и друзья, действительно сложно писать любые тесты, даже для моего собственного кода, который часто окружен кодом, который уже существует.
Потом наткнулся AspectMock, что кажется идеальным для того, что я пытаюсь сделать! Но я в худшее время пытаюсь заставить его работать. Я полагаю, это потому, что мы используем то, что кажется довольно нестандартной структурой каталогов для нашего проекта (я также упомянул, что я никогда раньше не работал с PHP или Magento?). Мы используем modman и composer, и наше дерево проектов выглядит примерно так:
.modman
|-magento_plugin1
|-magento_plugin2
|-our-src
|-app
|-code
|-community
|-core
|-local
|-CompanyName
|-ModuleName
|-Block
|-controllers
|-data
|-etc
|-Helper
|-lib
|-Model
|-sql
|-design
|-etc
|-locale
|-...
|-lib
|-var
|-...
|-tests
|-unit
|-CompanyName
|-ModuleName
|-Helper
|-SomeTest.php
|-bootstrap.php
|-phpunit.xml
|-...
vendor
composer.lock
...
htdocs <- once you've run the setup scripts
|-app
|-code
|-community
|-core
|-local
|-*symlink to our_src from modman*
|-design
|-...
|-.htaccess
|-bootstrap.php
|-Mage.php
|-...
|-lib
|-var
|-...
Согласно документации, я добавил его в наш composer.json:
"require-dev": {
"phpunit/phpunit": "^6",
"codeception/aspect-mock": "*"},
Мой phpunit.xml, который существует в tests
каталог это:
<?xml version="1.0" encoding="UTF-8" ?>
<phpunit backupGlobals="false"backupStaticAttributes="false"colors="true"convertErrorsToExceptions="true"convertNoticesToExceptions="true"convertWarningsToExceptions="true"processIsolation="false"stopOnFailure="false"syntaxCheck="true"bootstrap="./bootstrap.php">
<testsuite name="Magento Unit Test">
<directory>.</directory>
</testsuite>
</phpunit>
И файл bootstrap.php (в настоящее время):
<?php
require __DIR__ . '/../../../../vendor/autoload.php';
$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
'appDir' => '../../../../.modman', // I don't know what this should be
'debug' => true,
'includeDir' => ['../../../../htdocs/app'], // I don't know what this should be
'cacheDir' => '/tmp/AspectMock',
]);
//Include Magento libraries
require_once '../../../../htdocs/app/Mage.php';
//Start the Magento application
Mage::app('default');
//Avoid issues "Headers already sent"session_start();
И я написал свой SomeTest.php:
<?php
namespace SomeTest;
use \PHPUnit\Framework\TestCase;
use \AspectMock\Test;
use Mage;
final class Hub_Account_Helper_Iq_DataTest extends TestCase
{
public function test1()
{
Test::double('Mage', ['getModel' => 'yeah']);
$this->assertEquals('yeah', Mage::getModel('cms/page'));
}
}
Когда я бегу phpunit
, тест не пройден, так как Mage :: getModel () не возвращает строку (и поэтому не равен 'yeah'
). Это означает, что Mage
не издеваются
Я пробовал различные перестановки appDir
а также includePaths
но безрезультатно.
PHP Fatal error: Uncaught Error: Class 'Go\ParserReflection\Instrument\PathResolver' not found in /path/to/project/vendor/goaop/parser-reflection/src/ReflectionEngine.php:218
appDir => '../../../..'
(корень каталога проекта) приводит к тому же, что и выше (с или без includePaths
устанавливается).appDir => '../../../../htdocs'
(опять же, с или без includePaths
) приводит к тому, что тесты запускаются и дают сбой, потому что Маг фактически не подвергается насмешкам.appDir => '../../../../htdocs/app'
такой же, как указано выше.appDir => '../../../../.modmap/our-src/'
или же '../../../../.modman/our-src/app'
та же…Пожалуйста помоги! И благодарю вас.
Задача ещё не решена.
Других решений пока нет …