Не получается запустить тесты PHPUnit под micro

Всё про тестирование в Yii 2.0
Ответить
Аватара пользователя
villiwalla
Сообщения: 9
Зарегистрирован: 2017.07.05, 11:57

Не получается запустить тесты PHPUnit под micro

Сообщение villiwalla » 2020.02.13, 21:55

Использую yii2 как микрофреймворк для апи. Решил использовать phpunit, но вот при запуске тестов получаю ошибку о том что класс не найден.

Структура:

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

./api
├── controllers
├── helpers
├── migrations
├── models
├── tests
│   └── unit
│       └── models
 |                └── LinkTest.php  
├── vendor
_bootstrap.php

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

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
defined('YII_APP_BASE_PATH') or define('YII_APP_BASE_PATH', dirname(__DIR__));

require_once YII_APP_BASE_PATH . '/vendor/autoload.php';
require_once YII_APP_BASE_PATH . '/vendor/yiisoft/yii2/Yii.php';
require_once YII_APP_BASE_PATH . '/config.php';
phpunit.xml

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

<?xml version="1.0" encoding="utf-8" ?>
<phpunit bootstrap="./tests/_bootstrap.php">

    <testsuites>
        <testsuite name="Link">
            <directory>./tests/unit</directory>
        </testsuite>
    </testsuites>

</phpunit>
Запуск теста:

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

php ./vendor/bin/phpunit --bootstrap ./tests/_bootstrap.php --configuration ./phpunit.xml --teamcity --cache-result-file= ./.phpunit.result.cache
PHPUnit 9.0.0 by Sebastian Bergmann and contributors.

Error : Class 'api\models\Link' not found
 /home/rmshell/projects/api/tests/unit/models/LinkTest.php:13
Запуск тестов с учётом что конфиг по умолчанию подтянется ./vendor/bin/phpunit даёт такую же ошибку.

Видел на форуме что народ решал эту проблему за счёт того что они что-то указывали в autoload композера, но топик с этим ответом пропал с ТС этого топика. На SO видел решение того указывали в autolod, сомневался что дело в этом, но проверил и not found всё равно.

Аватара пользователя
maleks
Сообщения: 1845
Зарегистрирован: 2012.12.26, 12:56

Re: Не получается запустить тесты PHPUnit под micro

Сообщение maleks » 2020.02.14, 15:09

Добавьте в свой composer.json путь к вашему каталогу с кодом.
Вон например когда расширение пишешь и его тестируешь, то так.
Yii2 universal module sceleton - for basic and advanced templates

Аватара пользователя
villiwalla
Сообщения: 9
Зарегистрирован: 2017.07.05, 11:57

Re: Не получается запустить тесты PHPUnit под micro

Сообщение villiwalla » 2020.02.14, 16:01

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

	"autoload": {
		"psr-4": {
			api\\": "./"
		}
	},
	"autoload-dev": {
		"psr-4": {
			"api\\tests\\": ./tests/"
		}
	},
Что-то в таком духе я уже писал, но попробую ещё раз. И зачем мне указывать на исходники если композер уже сгенерировал карту для автолоада?

Аватара пользователя
ElisDN
Сообщения: 5468
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Не получается запустить тесты PHPUnit под micro

Сообщение ElisDN » 2020.02.14, 16:48

По умолчанию Composer генерирует карту только для кода в vendor. Свой код снаружи прописывается именно через "autoload". И после прописывания секции не забывайте вызывать composer dump-autoload

Аватара пользователя
villiwalla
Сообщения: 9
Зарегистрирован: 2017.07.05, 11:57

Re: Не получается запустить тесты PHPUnit под micro

Сообщение villiwalla » 2020.02.15, 13:22

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

{
  "require": {
    "yiisoft/yii2": "~2.0.31",
    "ext-json": "*",
    "ext-mbstring": "*"
  },
  "repositories": [
    {
      "type": "composer",
      "url": "https://asset-packagist.org"
    }
  ],
  "require-dev": {
    "phpunit/phpunit": "^9"
  },
  "autoload": {
    "psr-4": {
      "api\\": "./"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "api\\tests\\": "./tests"
    }
  }
}
Да, это действительно решило. Поскольку топик стартанул и уже одну ошибку решил, у меня новая ошибка. Не иницилизируется приложение, понятно что нету в бутстрапе new Application.

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

Error : Call to a member function getDb() on null
 /home/projects/api/vendor/yiisoft/yii2/db/ActiveRecord.php:135
 /home/projects/api/vendor/yiisoft/yii2/db/ActiveRecord.php:433
 /home/projects/api/vendor/yiisoft/yii2/db/ActiveRecord.php:469
 /home/projects/api/vendor/yiisoft/yii2/db/BaseActiveRecord.php:500
 /home/projects/api/vendor/yiisoft/yii2/db/BaseActiveRecord.php:291
 /home/projects/api/models/Link.php:33
 /home/projects/api/vendor/yiisoft/yii2/base/BaseObject.php:109
 /home/projects/api/tests/unit/models/LinkTest.php:13
если в контексте веба, то просит uri, а я то модель тестить собираюсь, иницилизовать приложение в контексте консоли или в вебе вырезать urlmanager? Какой вообще нужен контекст приложения для тестов?

Аватара пользователя
maleks
Сообщения: 1845
Зарегистрирован: 2012.12.26, 12:56

Re: Не получается запустить тесты PHPUnit под micro

Сообщение maleks » 2020.02.15, 14:22

Можно и с консольным приложением тестить и с веб приложением.

Вот у меня когда с веб приложением.
Но если чисто модели, то можно и с консольным, конфиг естественно нужно самому задавать, можете в моем другом расширении посмотреть как все эти тесты сделаны, с учетом фикстур.
Yii2 universal module sceleton - for basic and advanced templates

Аватара пользователя
villiwalla
Сообщения: 9
Зарегистрирован: 2017.07.05, 11:57

Re: Не получается запустить тесты PHPUnit под micro

Сообщение villiwalla » 2020.02.17, 22:45

maleks писал(а):
2020.02.15, 14:22
Можно и с консольным приложением тестить и с веб приложением.

Вот у меня когда с веб приложением.
Но если чисто модели, то можно и с консольным, конфиг естественно нужно самому задавать, можете в моем другом расширении посмотреть как все эти тесты сделаны, с учетом фикстур.
Спасибо, отличные примеры. Разобрался.

Ответить