我正在运行PHPUnit,使用自动加载类的引导文件(由作曲家生成)。
我所有的测试都可以加载类,但是对于我的两个测试,我创建了一个扩展\PHPUnit\Framework\TestCase
(类似于PHPUnit7之前的PHPUnit\Framework\u TestCase
)的“基本”测试类,然后是两个扩展基类的测试类,结构类似于下面的示例代码:
php prettyprint-override"> 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都会给出一个错误:
致命错误:在BlahBlahTest中找不到类“BaseTest”。第13行的php
我检查了文件名、位置、名称空间,一切似乎都井然有序。如果能帮上忙,我们将不胜感激
我不确定您是否仍然需要一个解决方案,但这对我来说很有效:
扩展PHPUnit\u框架的不可测试基类\u TestCase
对我来说,解决办法要简单得多。
Test
的大写字母和类名改为Test
BaseSomethingtest。php
<?php
namespace Something\Tests\Sub1\Sub2;
class BaseSomethingtest
{
}
BaseSomethingTestCase。php
<?php
namespace Something\Tests\Sub1\Sub2;
class BaseSomethingTestCase
{
}
我遇到了同样的问题,如果你不太熟悉PHPUnit和Composer的内部工作原理,这看起来确实令人困惑。
PHPUnit不使用使用Composer自动加载器来查找任何测试类。它只是扫描你给它的任何目录,并一次对一个文件进行操作。
因此,除了当前操作的文件中的类之外,它不知道任何其他类。这就是引导文件发挥作用的地方。
如果您想使用Composer Autoloader加载其他测试类,您需要告诉它在哪里可以找到这些测试类(以及,可选地,在哪个命名空间中)。
有两种方法可以做到这一点:
编写器中添加一个自动加载dev
部分。json
或autoload-dev
部分允许您为开发目的定义自动加载规则。
直接引用手册:
运行测试套件所需的类不应包含在主自动加载规则中,以避免在生产中污染自动加载程序,以及当其他人将您的包作为依赖项使用时。
因此,在单元测试中依赖专用路径并将其添加到Autoloaddev部分是一个好主意。
例子:
{
"autoload": {
"psr-4": { "MyLibrary\\": "src/" }
},
"autoload-dev": {
"psr-4": { "MyLibrary\\Tests\\": "tests/" }
}
}
另一种方法是获得Composer自动加载程序并添加测试名称空间(如果有)和测试所在的目录。如何做到这一点,如手册(在“基本用法”的自动加载部分的底部)所述,是:
$loader = require('/path/to/vendor/autoload.php');
$loader->add('Test\\', __DIR__ . '/Tests');
如果您的测试使用镜像测试目录的名称空间,并且您仍然遇到麻烦,您可以尝试通过将第一个参数('Test\\'
)替换为"
来省略前缀。
如果您想进一步了解所有这些是如何工作的,您应该看看Composer ClassLoader类,特别是add()
和findFile()
方法。
我是PHPUnit和单元测试的新手,所以我通过作曲家安装了PHPUnit和phar,一切都很好,直到我尝试开始我的简单测试。我使用PhpStorm,我可以看到所有的类都是自动加载的,但是当我试图开始我的测试时,我得到了一个错误: 我不明白他为什么要在高于PHPUnit的文件夹中查找它? 我试图在composer中配置自动加载部分。json和检查phpunit中的设置。xml,但什么都不起作用。 加
我的要求如下: > 我有几个.feature文件。我想创建所有这些特性文件通用的测试数据。一旦创建了测试数据,场景将从特性文件运行。 我还想要一些信息后,测试数据创建回来。例如,我创建的数据的ID。所以我可以使用这些信息来调用API,在我的场景中添加有效负载。 null 现在我已经在test-data-details.feature文件中拥有了测试数据对象。在包含测试场景的特性文件的后台部分,我将
这是一个关于PHP单元测试的问题,给出了一个类NotFound错误。 背景资料 我正在使用Zend Studio 10.5开发Zend Framework 2应用程序。我加载了一些模块,包括和 FedcoUser是具有使用BJYAAuthorize的保护规则的控制器保护的模块: 使用Zend Studio 10.5本机菜单,我为上面的控制器创建了一个测试用例。当我运行它时,我得到以下错误: 我的假
我有一个类似的问题,在这里描述: 一切都按照我的预期工作;我的代码访问数据库并打印输出,不管我是从命令行界面还是从网络浏览器运行。同样的结果。如果我用PHPUnit在Eclipse中运行它,我会得到一个错误: 哪些点位于下一行: 此代码打印出“是”。 还有一点需要指出的是,我在上面代码所在的类中使用自己的名称空间。我的单元测试在全局命名空间中。 我已经按照上面的URL中的步骤,但是,唉,没有用。:
使用java和testNG,我在两个不同的类test1.class和test2.class中有两个测试,还有一个包含大多数方法的base.class:
我有一个抽象类B,它扩展了另一个抽象类A。在抽象类A中,我有一个受保护的方法转换。我想测试方法foo,它从没有实现的基类调用方法convert。如果无法更改转换方法签名,如何模拟方法转换。 我使用Mockito.spy()调用真正的方法,但转换方法是不可用的嘲弄(通过Mockito.when(...)。 告诉我如何测试方法foo。