【问题标题】:Autoload classes for testing from separate directory自动加载类以从单独的目录进行测试
【发布时间】:2023-03-29 10:22:01
【问题描述】:

考虑以下项目布局:

/lib/
    Folders/For/Namespaces/SomeClass.php
/test/
    Folders/For/Namespaces/SomeClassTest.php
composer.json

这段摘自composer.json:

"autoload": {
    "psr-4": {
        "MyNamespace\\" : "lib/"
    }
},
"scripts": {
    "test": "phpunit --bootstrap vendor/autoload.php tests"
}

这让我可以运行composer test,它将执行SomeClassTest.php等等,而\MyNamespace\Folders\For\Namespaces\SomeClass被自动加载器找到。

虽然在构建抽象测试用例时,我无法让自动加载工作:

/test/
    Folders/For/Namespaces/SomeClassTest.php
    AbstractTest.php

此处\MyNamespace\Folders\For\Namespaces\SomeClassTest 扩展了\MyNamespace\AbstractTest,但自动加载器找不到。原因很明显,因为在composer.json 中,test/ 目录没有链接到命名空间。但是我怎样才能做到这一点呢?

我尝试将\MyNamespace\AbstractTest 移动到\MyNamespace\Test\AbstractTest 并将这个命名空间添加到composer.json,如下所示:

"autoload": {
    "psr-4": {
        "MyNamespace\\" : "lib/",
        "MyNamespace\\Test\\" : "test/"
    }
},

但这并没有帮助。我该怎么办?

【问题讨论】:

    标签: phpunit composer-php


    【解决方案1】:

    如果您只需要一些命名空间来进行测试,您可以使用spl_autoload_register 手动自动加载它们。 见http://php.net/manual/de/function.spl-autoload-register.php

    如果是 PHPUnit,我可以创建一个 Bootstrap.php,您可以在其中处理您的自动加载。此代码示例:

    spl_autoload_register(function($className) {
        $path = str_replace('\\', '/', $className);
        $testNs = 'MySeparate/Namespace';
        $testNsLength = strlen($testNs);
        if(substr($path, 0, $testNsLength) == $testNs) {
            include_once '/path/to/src/'.$path.'.php';
        }
    });
    

    将实现单独命名空间的 psr-4 自动加载。

    【讨论】:

      【解决方案2】:

      我可能回答得太晚了,但还是这样。

      问题的解决方案

      AbstractTest 类放入\MyNamespace\Test 命名空间。 这将使它与您的自动加载器配置一起使用:

      "autoload": {
          "psr-4": {
              "MyNamespace\\" : "lib/",
              "MyNamespace\\Test\\" : "test/"
          }
      },
      

      开发时自动加载器

      请使用autoload-dev 部分定义开发时间自动加载器配置:

      "autoload": {
          "psr-4": {
              "MyNamespace\\" : "lib/",
          }
      },
      "autoload-dev": {
          "psr-4": {
              "MyNamespace\\Test\\" : "test/"
          }
      },
      

      【讨论】:

      • 谢谢。这对我帮助很大。
      猜你喜欢
      • 2014-06-14
      • 2010-11-26
      • 2011-10-06
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多