草庐IT

php - 为 PHPUnit 创建一个基本测试类并将其扩展为通用功能会导致类未找到错误

coder 2023-06-13 原文

我正在使用引导文件运行 PHPUnit 以自动加载类(由 composer 生成)。

我所有的测试加载类都很好,但是对于我的两个测试,我做了一个“基础”测试类,它扩展了 \PHPUnit\Framework\TestCase(类似于 PHPUnit_Framework_TestCase 在 PHPUnit7 之前),然后是两个扩展基类的测试类,结构类似于以下示例代码:

    abstract class BaseTest extends \PHPUnit\Framework\TestCase
    {
        abstract function setUp();

        protected function getCommonTestVariables()
        {
            // ...
        }

        protected function runCommonTests()
        {
            // ...
        }
    }
    class BlahBlahTest extends BaseTest
    {
        public function setUp()
        {
             $variables=$this->getCommonTestVariables();
             //etc...
        }

        public function testThings()
        {
            $this->runCommonTests();
        }
    }

每当我运行它时,PHPUnit 都会报错:

fatal error :在第 13 行的 BlahBlahTest.php 中找不到类“BaseTest”

我检查了文件名、位置、命名空间,一切似乎都井井有条。任何帮助将不胜感激,以了解这一点

最佳答案

我遇到了同样的问题,如果您不太熟悉 PHPUnit 和 Composer 的内部工作原理,这确实看起来令人困惑。

PHPunit 不使用 Composer 自动加载器来查找您的任何测试类。它只会扫描您提供给它的任何目录,并一次对一个文件进行操作。

因此,除了当前正在操作的文件中的类之外,它不知道任何其他类。这就是引导文件发挥作用的地方。

如果您想使用 Composer Autoloader 加载其他测试类,您需要告诉它在哪里可以找到这些测试类(以及,可选地,在哪个命名空间中)。

有两种方法可以做到这一点:

  1. 添加 autoload-dev composer.json
  2. 部分
  3. 将测试目录添加到 Composer Autoloader

使用 autoload-dev

autoload-dev 部分允许您为开发目的定义自动加载规则。

直接引用 the manual :

Classes needed to run the test suite should not be included in the main autoload rules to avoid polluting the autoloader in production and when other people use your package as a dependency.

Therefore, it is a good idea to rely on a dedicated path for your unit tests and to add it within the autoload-dev section.

Example:

{
    "autoload": {
        "psr-4": { "MyLibrary\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary\\Tests\\": "tests/" }
    }
}

添加到 Composer 自动加载器

另一种方法是获取 Composer Autoloader 和 add 您的测试命名空间(如果有的话)和测试所在的目录。如何做到这一点,as described in the manual (在“基本用法”中自动加载部分的底部)是:

$loader = require('/path/to/vendor/autoload.php');
$loader->add('Test\\', __DIR__ . '/Tests');

如果您的测试使用镜像测试目录的命名空间并且您仍然遇到问题,您可以尝试通过将第一个参数 ('Test\\') 替换为 ' 来省略前缀'.


如果您想进一步了解所有这些工作原理,您应该查看 Composer ClassLoader class ,尤其是 add()findFile() 方法。

关于php - 为 PHPUnit 创建一个基本测试类并将其扩展为通用功能会导致类未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880067/

有关php - 为 PHPUnit 创建一个基本测试类并将其扩展为通用功能会导致类未找到错误的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  7. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  8. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐