首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义要在CodeCeption测试中使用的自定义PHP类

定义要在CodeCeption测试中使用的自定义PHP类
EN

Stack Overflow用户
提问于 2018-12-08 07:39:03
回答 2查看 1.6K关注 0票数 1

我是CodeCeption的新手,我从几个简单的API测试用例开始。我希望创建自己的类,以便在多个文件中管理我的方法。我在目录MyClass.php中编写了一个名为_support的新PHP文件,其中包含一个名为MyClass的类。

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

我已经在codeception.yml文件中的依赖项中添加了这个类。

代码语言:javascript
复制
modules:
    enabled:
        - MyClass

我还在MyClass中添加了actor作为api.suite.yml

代码语言:javascript
复制
actor: MyClass

为了在我的测试中访问上述类,我试图构建这个项目,但是它找不到模块:

代码语言:javascript
复制
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帮助说明更改了我的代码和配置。

这是我现在的文件结构:

代码语言:javascript
复制
test
|_ src
   |_ MyClass.php
|_ tests
   |_ ...
   |_ mytests
      |_ MyCest.php
   |_ ...
   |_ mytests.suite.yml
   |_ ...
|_ vendor
|_ codeception.yml
|_ composer.json
|_ composer.lock

这是我的composer.json

代码语言:javascript
复制
{
    "require": {
        "codeception/base": "^2.5",
        "ext-json": "*"
    },
    "autoload": {
        "psr-4": {
            "Codeception\\Module\\": "src/"
        }
    }
}

这段代码在MyClass.php内部

代码语言:javascript
复制
<?php
class MyClass extends \Codeception\Actor
{
    public function SayHi($name) {
        $respBody = 'hi' . $name;
        return json_decode($respBody, true) ;
    }
}

这段代码在MyCest.php内部

代码语言:javascript
复制
<?php
class MyCest
{
    public function MyTestCase(MyClass $I)
    {
        $I->SayHi('ZiZi');
    }
}

这是在mytests.suite.yml里面

代码语言:javascript
复制
actor: ApiTester
modules:
  enabled:
    - REST:
        depends: PhpBrowser
        part: Json

    - Asserts:

现在,构建还可以,它的日志(暗示mytests )已经成功地作为一个套件加载了:

代码语言:javascript
复制
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

但是,正在运行的测试遇到了一个错误:

代码语言:javascript
复制
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中的类定义更改为;结果是:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-12 10:31:37

我终于解决了这个问题,多亏了“Alexey”和“Naktibalda”。

我将包含类MyClass.php的PHP文件放在目录src/中,并在composer.json中将类定义为:

代码语言:javascript
复制
{
    "require": {
        "codeception/base": "^2.5",
        "ext-json": "*",
        "codeception/codeception": "^2.5"
    },
    "autoload": {
        "classmap": ["src/"]
    }
}

这是我现在的文件结构:

代码语言:javascript
复制
test
|_ src
   |_ MyClass.php
|_ tests
   |_ ...
   |_ mytests
      |_ MyCest.php
   |_ ...
   |_ mytests.suite.yml
   |_ ...
|_ vendor
|_ codeception.yml
|_ composer.json
|_ composer.lock

这段代码在MyClass.php内部

代码语言:javascript
复制
<?php
class MyClass extends \Codeception\Actor
{
    public function SayHi($name) {
        $respBody = 'hi' . $name;
        return $respBody;
    }
}

这段代码在MyCest.php内部

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

这是在mytests.suite.yml里面

代码语言:javascript
复制
actor: ApiTester
modules:
  enabled:
    - REST:
        depends: PhpBrowser
        part: Json

    - Asserts:
票数 1
EN

Stack Overflow用户

发布于 2018-12-08 08:22:47

首先编写助手代码不是更容易吗?在本例中,您的类是从\Codeception\Module而不是\Codeception\Actor扩展的吗?然后保持配置不变,然后删除,将其添加为Actor。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53680558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档