【问题标题】:class not found when unit testing a custom module单元测试自定义模块时找不到类
【发布时间】:2018-06-05 20:05:06
【问题描述】:

我正在尝试为我在 Drupal 8 上编写的自定义模块编写测试并不断收到错误,此时我没有想法。这是错误:

Error: Class 'Drupal\mypackage\Services\Config\MyClassServiceConfig' not found

PhpUnit 类在

modules\custom\mypackage\tests\src\Unit\mypackageUserAuthTest

这里是代码

class mypackageUserAuthTest extends UnitTestCase
{
    protected $user;
    protected $loginService;

    public function setUp()
    {
        parent::setUp();

        $this->loginService = new LoginService();

        $this->user = [
            'username'  => 'xxx',
            'password'  => 'xxx',
            'deviceId'  => 'xxx',
            'some-token' => 'xxx'
        ];
    }

    /** @test */
    public function that_we_can_authenticate_a_user()
    {
        $IsUserLoggedIn = $this->loginService->login($this->user['username'], $this->user['password']);

        $this->assertTrue($IsUserLoggedIn);
    }

现在loginService 代码中的方法login

<?php

namespace Drupal\mypackage\Rest;

use GuzzleHttp\Exception\ClientException;

use Drupal\mypackage\Services\RestServiceFactory;
use Drupal\mypackage\Services\Config\MyClassServiceConfig;

class LoginService
{
    public function login($username, $password)
    {
        $configs = new MyClassServiceConfig(null, "mobile", "v1");
        $client  = RestServiceFactory::create($configs);

        try {
            $response = $client->post('login', [
                'json' => [
                        'username' => $username,
                        'password' => $password,
                        'deviceId' => 'onepiece',
                    ],
            ]);
            return json_decode($response->getBody(), true);
        } catch (ClientException $exception) {
            switch ($$exception->getResponse()->getStatusCode()) {
                case 402: // This only applies to co members
                    throw new SubscriptionRequiredException();
                case 403:
                    throw new BlockedAccountException();
                case 409:
                    throw new DuplicateEmailException();
                case 410:
                    throw new PasswordDoesNotExistException();
            }
            throw $exception;
        }
    }
}

pwdMyClassServiceConfig 类目录上的结果 /var/www/cms/web/modules/custom/mypackage/src/Services/Config

但它似乎在$configs = new MyClassServiceConfig(null, "mobile", "v1"); 行失败,出现前面提到的错误:

1) Drupal\Tests\mypackage\Unit\mypackageUserAuthTest::that_we_can_authenticate_a_user
Error: Class 'Drupal\mypackage\Services\Config\MyClassServiceConfig' not found

顺便说一句,我正在使用 drupal 项目结构 (https://github.com/drupal-composer/drupal-project)

【问题讨论】:

  • 试试这个命令composer -o dump-autoload 如果转储优化的自动加载器解决了你的问题,但不优化它仍然显示它,你的目录或文件名中的某个地方有错字,这会阻止 PSR-4 或 PSR- 0 自动加载。
  • @KevinWenger 我使用路由调用模块时没有错误。错误class not found 仅在我从单元测试类中调用它时出现。好像该类未正确自动加载,但仅在由 phpunit 调用时
  • 是的,我知道这就是我要求您运行composer -o dump-autoload 的原因。您是否尝试运行此命令然后重新运行 phpunit ?它仍然不工作?这似乎是您的目录或文件中的错字 - 但我不确定 - 此命令是否会断言它 - 或不会:D
  • @KevinWenger 是的,我每次都在运行$ composer dump-autoload &amp;&amp; vendor/bin/phpunit -c web/core --debug --verbose web/modules/custom/mypackage/。好的,所以我运行了composer -o dump-autoload 然后通过它的路径加载模块并且它工作了。我在整个 phpunit 中加载它,但遇到了最初的问题......已经好几天了,这东西要了我的命......
  • 您能否进入MyClassServiceConfig 的目录并运行pwd,然后将结果传递到此处-我只是想确定这不是您的目录名称中的拼写错误。您能否在同一个目录中运行ls -la 以确保它注意文件名拼写错误。然后,您可以将此结果添加到问题本身。

标签: phpunit drupal-modules drupal-8


【解决方案1】:

所以我花了几天时间检查路径,但文件似乎没有加载,所以我最终将自定义模块添加到 autload-dev 部分 composer.json

"autoload": {
    "classmap": [
        "scripts/composer/ScriptHandler.php"
    ],
    "files": ["load.environment.php"]
},
"autoload-dev": {
    "psr-4": { "Drupal\\mypackage\\": "web/modules/custom/mypackage" }
},

现在至少它似乎加载了模块,因为我收到了与 Drupal Container 相关的其他错误 \Drupal::$container is not initialized yet. \Drupal::setContainer() must be called with a real container.

【讨论】:

    【解决方案2】:

    这是一个老问题,同样的事情发生在我身上,因为我设法解决了这个问题,如下所示:

    在执行测试的类的注释中,应该有类似的内容:

    @coversDefaultClass 注解必须与要测试的类的命名空间一起使用。

    /**
     * @coversDefaultClass \Drupal\my_module\MyModuleClassName
     * @group my_module
    */
    class MyModuleCaseTest extends UnitTestCase {
    
    }
    

    也许它会为别人服务

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2020-10-04
      • 2017-08-19
      • 2013-04-24
      • 2023-03-30
      • 2018-05-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多