Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Возникает Fatal error при создании stub


(maxgu) #1

Как воспроизвести:

  1. Создаю простой класс, который буду тестировать MyClass.php:

    <?php class MyClass { public function baz(){} }
  2. Инициализрую codeception
    $ codeception bootstrap

  3. Создаю Unit тест
    $ codeception g:test unit TestMock

  4. Вот такой вот тест:

    <?php $rootdir = dirname(dirname(__DIR__)); include $rootdir . '/MyClass.php'; class TestMockTest extends \Codeception\TestCase\Test { public function testMe() { //$my = new MyClass(); $my = $this->getMockBuilder('MyClass') ->disableOriginalConstructor() ->getMock(); } }

(new MyClass() работает, создает инстанс MyClass)

  1. Запускаю тесты
    $ codecept run
    Codeception PHP Testing Framework v2.0.5
    Powered by PHPUnit 4.2.2 by Sebastian Bergmann.

Unit Tests (1) -----------------------------------------------------------------
Trying to test me (TestMockTest::testMe) PHP Fatal error: Class ‘Instantiator\Instantiator’ not found in phar:///usr/bin/codecept/vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php on line 292
PHP Stack trace:
PHP 1. {main}() /usr/bin/codecept:0
PHP 2. require_once() /usr/bin/codecept:7
PHP 3. Symfony\Component\Console\Application->run() phar:///usr/bin/codecept/codecept:34
PHP 4. Symfony\Component\Console\Application->doRun() phar:///usr/bin/codecept/vendor/symfony/console/Symfony/Component/Console/Application.php:124
PHP 5. Symfony\Component\Console\Application->doRunCommand() phar:///usr/bin/codecept/vendor/symfony/console/Symfony/Component/Console/Application.php:193
PHP 6. Symfony\Component\Console\Command\Command->run() phar:///usr/bin/codecept/vendor/symfony/console/Symfony/Component/Console/Application.php:889
PHP 7. Codeception\Command\Run->execute() phar:///usr/bin/codecept/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:252
PHP 8. Codeception\Command\Run->runSuites() phar:///usr/bin/codecept/src/Codeception/Command/Run.php:183
PHP 9. Codeception\Codecept->run() phar:///usr/bin/codecept/src/Codeception/Command/Run.php:255
PHP 10. Codeception\Codecept->runSuite() phar:///usr/bin/codecept/src/Codeception/Codecept.php:145
PHP 11. Codeception\SuiteManager->run() phar:///usr/bin/codecept/src/Codeception/Codecept.php:162
PHP 12. Codeception\PHPUnit\Runner->doEnhancedRun() phar:///usr/bin/codecept/src/Codeception/SuiteManager.php:153
PHP 13. PHPUnit_Framework_TestSuite->run() phar:///usr/bin/codecept/src/Codeception/PHPUnit/Runner.php:100
PHP 14. PHPUnit_Framework_TestCase->run() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestSuite.php:703
PHP 15. PHPUnit_Framework_TestResult->run() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestCase.php:771
PHP 16. PHPUnit_Framework_TestCase->runBare() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestResult.php:643
PHP 17. PHPUnit_Framework_TestCase->runTest() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestCase.php:835
PHP 18. ReflectionMethod->invokeArgs() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestCase.php:963
PHP 19. TestMockTest->testMe() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestCase.php:963
PHP 20. PHPUnit_Framework_MockObject_MockBuilder->getMock() /storage/proj/zftest/tests/unit/TestMockTest.php:26
PHP 21. PHPUnit_Framework_TestCase->getMock() phar:///usr/bin/codecept/vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php:142
PHP 22. PHPUnit_Framework_MockObject_Generator->getMock() phar:///usr/bin/codecept/vendor/phpunit/phpunit/src/Framework/TestCase.php:1318
PHP 23. PHPUnit_Framework_MockObject_Generator->getObject() phar:///usr/bin/codecept/vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php:264

FATAL ERROR. TESTS NOT FINISHED.
Class ‘Instantiator\Instantiator’ not found
in phar:///usr/bin/codecept/vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php:292

Что я делаю не так?
(Вот тут чуть подребнее https://github.com/Codeception/Codeception/issues/1385)


(Web777) #2

+1 тоже наблюдал такую ошибку


(Michael Bodnarchuk) #3

Уже описано в https://github.com/Codeception/Codeception/issues/1385

Если найдете баг - кидайте на гитхаб, в ближайшем багфикс спринте постараюсь с ним разобраться.
Спасибо.


(maxgu) #4

На гитхабе это давно есть - никто не ответил … я уж подумал, что я плохо описал или автор не читает issues.
Это CRITICAL, неужели никто не пишет unit тесты??
Мне понравился Codeception тем, что я могу писать все виды тестов одним инструменотом (Acceptance, Functional, Unit). А теперь я вернулся на phpUnit, т.к. не могу писать Unit тесты на Codeception.


(Michael Bodnarchuk) #5

На Stub написано достаточно юнит тестов. А у вас конкретная ошибка, которую надо пофиксить и написать регрессионный тест.

Codeception никаким образом не ограничивает вас в использовании моков. Класс Stub это не более чем обертка над MockBuilder из PHPUnit, собственно моки можете делать моки, как в классическом юните. Или использовать Mockery. ИЛи Phaker…


(maxgu) #6

В том-то и дело, что я использую phpUnit MockBuilder внутри Codeception.

$my = $this->getMockBuilder('MyClass')
->disableOriginalConstructor()
->getMock();

Но ошибка таже. Как-будто не правильно собрался ваш phar - там как-то плохо собрался phpUnit (или плохо работает автолоадер класов).

Т.е. ошибка не в Codeception, а в phpUnit:
PHP 23. PHPUnit_Framework_MockObject_Generator->getObject() phar:///usr/bin/codecept/vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php:264

Но! такой же версией phpUnit пользуюсь я - там нет проблем с моками, они есть только в codeception.phar.

P.S. я не имел ввиду, что нет тестов на Stub, я имел ввиду: Неужели никто не пишет на Codeception unit тесты? Все пишут только acceptance тесты? Если бы пользователи Codecetion писали unit тесты используя Codeception (как в примере в самом первом коментарии) то у всех была бы такая ошибка.


(Michael Bodnarchuk) #7

Да, оказалось, что проблема специфична для phar - архива. Один из нужных пакетов не был добавлен в phar, из-за этого возникает ошибка. В версии 2.0.6 она будет исправлена.