Определите пользовательские классы PHP для использования в тестах CodeCeption

Я новичок в CodeCeption, и я начал с нескольких простых тестовых случаев API. Я хотел создать свои собственные классы, чтобы управлять моими методами в нескольких файлах. Я написал новый файл PHP с именем MyClass.php в каталоге _support который имеет класс с именем MyClass внутри.

<?php
class MyClass extends \Codeception\Actor
{
use _generated\ApiTesterActions;
public  function  SayHi($name) {
$respBody = [
'hi' => 'hi' + $name
];
return json_decode($respBody, true) ;
}
}

Я добавил этот класс в мои зависимости в файле codeception.yml:

modules:
enabled:
- MyClass

Я также добавил MyClass в качестве actor в api.suite.yml:

actor: MyClass

Я попытался построить проект, чтобы иметь доступ к упомянутому классу в моих тестах, но он не смог найти модуль:

zeinab@Zeinab:~/PhpstormProjects/api-testing$ php vendor/bin/codecept build
Building Actor classes for suites: acceptance, api, functional, unit

In ModuleContainer.php line 80:

Module MyClass could not be found and loaded


build

Я что-то пропустил?

Я ранее добавил этот модуль в классе ApiTester в файле ApiTester.php и это работало нормально; Я мог бы построить проект и использовать метод в тестах.

РЕДАКТИРОВАТЬ 1:

Я изменил свой код и настройки на основе справочных заметок @Alexey и @Naktibalda.

Это моя файловая структура сейчас:

test
|_ src
|_ MyClass.php
|_ tests
|_ ...
|_ mytests
|_ MyCest.php
|_ ...
|_ mytests.suite.yml
|_ ...
|_ vendor
|_ codeception.yml
|_ composer.json
|_ composer.lock

Это мое composer.json:

{
"require": {
"codeception/base": "^2.5",
"ext-json": "*"},
"autoload": {
"psr-4": {
"Codeception\\Module\\": "src/"}
}
}

Этот код внутри MyClass.php:

<?php
class MyClass extends \Codeception\Actor
{
public function SayHi($name) {
$respBody = 'hi' . $name;
return json_decode($respBody, true) ;
}
}

Этот код внутри MyCest.php:

<?php
class MyCest
{
public function MyTestCase(MyClass $I)
{
$I->SayHi('ZiZi');
}
}

Это внутри mytests.suite.yml:

actor: ApiTester
modules:
enabled:
- REST:
depends: PhpBrowser
part: Json

- Asserts:

Теперь, сборка в порядке, и его журналы подразумевают mytests был успешно загружен как набор:

zeinab@Zeinab:~/PhpstormProjects/test$ codecept build
==== Redirecting to Composer-installed version in vendor/codeception ====
Building Actor classes for suites: acceptance, api, functional, mytests, unit
-> AcceptanceTesterActions.php generated successfully. 0 methods added
\AcceptanceTester includes modules: PhpBrowser, \Helper\Acceptance
-> ApiTesterActions.php generated successfully. 0 methods added
\ApiTester includes modules: \Helper\Api
-> FunctionalTesterActions.php generated successfully. 0 methods added
\FunctionalTester includes modules: \Helper\Functional
-> ApiTesterActions.php generated successfully. 0 methods added
\ApiTester includes modules: REST, PhpBrowser, Asserts
-> UnitTesterActions.php generated successfully. 0 methods added
\UnitTester includes modules: Asserts, \Helper\Unit

Но при выполнении тестов возникает ошибка:

zeinab@Zeinab:~/PhpstormProjects/test$ codecept run tests/mytests/MyCest.php

==== Redirecting to Composer-installed version in vendor/codeception ====
Codeception PHP Testing Framework v2.5.1
Powered by PHPUnit 7.5.0 by Sebastian Bergmann and contributors.
Running with seed:


Mytests Tests (1) -------------------------------------------------------------------------------------------------------------
E MyCest: My test case (0.00s)
-------------------------------------------------------------------------------------------------------------------------------
DEPRECATION: Calling the "Symfony\Component\BrowserKit\Client::getInternalResponse()" method before the "request()" one is deprecated since Symfony 4.1 and will throw an exception in 5.0. /home/zeinab/PhpstormProjects/test/vendor/symfony/browser-kit/Client.php:217


Time: 76 ms, Memory: 12.00MB

There was 1 error:

---------
1) MyCest: My test case
Test  tests/mytests/MyCest.php:MyTestCase

[InjectionException] Failed to inject dependencies in instance of 'MyCest'. Class MyClass does not exist

#1  phar:///usr/local/bin/codecept/autoload.php:12
#2  /usr/local/bin/codecept:5

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Я думаю, что у меня все еще есть проблема в настройке моего composer.json, но я не могу понять это.

РЕДАКТИРОВАТЬ 2:

Я изменил свое определение класса в composer.json к «; результат был:

zeinab@Zeinab:~/PhpstormProjects/test$ codecept run tests/mytests/MyCest.php

==== Redirecting to Composer-installed version in vendor/codeception ====
Codeception PHP Testing Framework v2.5.1
Powered by PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
Running with seed:


Mytests Tests (1) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E MyCest: My test case (0.00s)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DEPRECATION: Calling the "Symfony\Component\BrowserKit\Client::getInternalResponse()" method before the "request()" one is deprecated since Symfony 4.1 and will throw an exception in 5.0. /home/zeinab/PhpstormProjects/test/vendor/symfony/browser-kit/Client.php:217


Time: 76 ms, Memory: 12.00MB

There was 1 error:

---------
1) MyCest: My test case
Test  tests/mytests/MyCest.php:MyTestCase

[InjectionException] Failed to inject dependencies in instance of 'MyCest'. Class MyClass does not exist

#1  phar:///usr/local/bin/codecept/autoload.php:12
#2  /usr/local/bin/codecept:5

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

1

Решение

Я наконец исправил проблему; спасибо @Alexey и @Naktibalda.

Я положил PHP-файл, содержащий мой класс, MyClass.phpв каталоге src/ и определил мой класс в composer.json как:

{
"require": {
"codeception/base": "^2.5",
"ext-json": "*",
"codeception/codeception": "^2.5"},
"autoload": {
"classmap": ["src/"]
}
}

Это моя файловая структура сейчас:

test
|_ src
|_ MyClass.php
|_ tests
|_ ...
|_ mytests
|_ MyCest.php
|_ ...
|_ mytests.suite.yml
|_ ...
|_ vendor
|_ codeception.yml
|_ composer.json
|_ composer.lock

Этот код внутри MyClass.php:

<?php
class MyClass extends \Codeception\Actor
{
public function SayHi($name) {
$respBody = 'hi' . $name;
return $respBody;
}
}

Этот код внутри MyCest.php:

<?php
class MyCest
{
public function MyTestCase(MyClass $I)
{
$resp = $I->SayHi('ZiZi');
echo "Response: " . $resp;
}
}

Это внутри mytests.suite.yml:

actor: ApiTester
modules:
enabled:
- REST:
depends: PhpBrowser
part: Json

- Asserts:
1

Другие решения

Не будет ли проще сначала написать помощник? В этом случае продлите свой класс от \Codeception\Moduleне \Codeception\Actor? Оставьте тогда ваш конфиг как есть и удалите добавив его как актера

0

По вопросам рекламы [email protected]