Определите пользовательские классы PHP для использования в тестах CodeCeption - PullRequest
0 голосов
/ 08 декабря 2018

Я новичок в 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, но я не могу 't понять это.

РЕДАКТИРОВАТЬ 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.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я наконец исправил проблему;благодаря @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:
0 голосов
/ 08 декабря 2018

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

...