【问题标题】:PHPUnit test class can't extend another classPHPUnit 测试类不能扩展另一个类
【发布时间】:2019-01-06 09:50:16
【问题描述】:

目前,我有一个基础测试类,我的测试应该扩展:

<?php
namespace BlaBla;
class BasicTestCase extends UnitTest {
    public function testPage()
    {
        $this->assertTrue(True);
    }
}

在我的测试课中:

<?php
use BlaBla\BasicTestCase;
class BasicTest extends BasicTestCase {
}

我的问题是,如果我运行 phpunit 并且我想测试 BasicTest,我总是会收到错误 BasicTestCase class not found

经过搜索,我了解到phpunit没有使用composer,但是我无法解决这个冲突。

更新:

使用 require_oncecomposer dump-autload 只会产生相同的错误(找不到类 Base)。
还为该类提供了一个命名空间,并没有解决问题(总是同样的错误)。

这里是 phpunit.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="phpunit.php"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false">
<testsuites>
    <testsuite name="Application Test Suite">
        <directory>./tests/</directory>
    </testsuite>
     <testsuite name="Core Test Suite">
        <directory>./vendor/ipo/prodis-core/tests/</directory>
    </testsuite>
</testsuites>
<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    <env name="DB_CONNECTION" value="sqlite_testing"/>
</php>

composer.json 太长了,我这里加了import:

"autoload-dev": {
    "classmap": [
      "tests/AppTestCase.php",
      "tests/AppTestCaseClassic.php",
      "vendor/ipo/prodis-core/tests/TestCase.php"
    ]
},

对于结构,我添加了第二个类BasicTest,在Laravel 的文件夹tests 下,Services\Client\Testing 下。

我注意到的是 phpunit 总是在 BasicTest 的同一位置搜索 Base class

【问题讨论】:

  • composer dump-autoload
  • 你可以简单地require_once你的其他源文件。
  • @J.Doe composer dump-autoload 没有帮助
  • @NigelRen 也 require_once 没有帮助
  • 如果您遇到自动加载问题,请分享您的composer.jsonphpunit.xml 和测试目录结构,以便我们向您推荐解决此问题的方法

标签: php laravel unit-testing phpunit


【解决方案1】:
bootstrap="phpunit.php"

这一行意味着 PHPUnit 将在运行测试之前包含 phpunit.php 文件(来自项目的根目录) - 您应该在其中包含自动加载器:

<?php

require __DIR__ . '/vendor/autoload.php';

// rest of tests bootstrap

或者,如果您不需要任何额外的引导程序,您可以将自动加载程序直接作为引导程序文件包含在phpunit.xml

bootstrap="vendor/autoload.php"

另外的事情是自动加载规则。很难说你的情况发生了什么,因为你没有分享你的文件限制。但是如果你使用命名空间来测试基类,你可以为这些类注册常规的psr-4自动加载规则:

"autoload-dev": {
    "psr-4": {
        "BlaBla\\": "tests/"
    }
},

然后将您的BasicTestCase 类定义放入tests/BasicTestCase.php

【讨论】:

  • 即使有额外的autoload-dev 条目和bootstrap="vendor/autoload.php",这仍然会导致在phpunit 中找不到类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2012-09-30
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多