PHP 致命错误:在 PHPUnit 6 和 PHP 7.0 中找不到类“PHPUnit\Framework\TestCase”

2022-08-31 00:57:48

我正在玩php 7和phpunit 6。这是我写的测试:

<?php declare(strict_types=1);

namespace Test;

use DesignPatterns\Observer\User;
use DesignPatterns\Observer\UserObserver;
use PHPUnit\Framework\TestCase;

class ObserverTest extends TestCase
{
    public function testChangeInUserLeadsToUserObserverBeingNotified()
    {
        $observer = new UserObserver();

        $user = new User();
        $user->attach($observer);

        $user->changeEmail('foo@bar.com');
        $this->assertCount(1, $observer->getChangedUsers());
    }
}

当我尝试运行此测试时,我收到以下错误消息:

PHP Fatal error:  Class 'PHPUnit\Framework\TestCase' not found in /home/.../.../Test/ObserverTest.php on line 9

我用作曲家安装了PHPUnit,这是我的composer.json文件内容:

{
    "require": {
        "phpunit/phpunit": "^6.0"
    },
    "autoload": {
        "psr-4": {"DesignPatterns\\": "src/"}
    }
}

根据 PHPUnit 6 文档,您的测试现在应该扩展 PHPUnit\Framework\TestCase,而不是PHPUnit_Framework_TestCase。

我知道这不是自动加载的问题。实际上,如果我用PHPUnit_Framework_TestCase替换PHPUnit\Framework\TestCase,它工作得很好,但我想知道为什么这个语法不起作用。

我尝试了对google,stackoverflow和PHPUnit的github存储库进行一些研究,但找不到任何东西。

我期待着你的回答,

编辑

以下是我的文件的组织方式:

src/
├── DataMapper
│   ├── StorageAdapter.php
│   ├── UserMapper.php
│   └── User.php
├── Observer
│   ├── UserObserver.php
│   └── User.php
Test/
├── DataMapperTest.php
└── ObserverTest.php

答案 1

我找到了答案:

我用这个命令行执行我的测试:

phpunit Test/ObserverTest.php

PHPUnit 已全局安装在我的计算机上,但它是 5.1.3 版本:

phpunit -v

PHPUnit 5.1.3 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.13-0ubuntu0.16.04.1 with Xdebug 2.4.0
Configuration: /home/.../.../DesignPatterns/phpunit.xml

语法 PHPUnit\Framework\TestCase 仅适用于 PHPUnit 6

现在,如果我运行,它可以完美地工作...php vendor/bin/phpunit Test/ObserverTest.php


答案 2

我正在发布这个,以防有人在升级到Symfony 4.4 / 5.0后最终在这里,并且遇到此错误。

在较新版本的 Symfony 中,您有一个版本在 .此版本将在您运行时下载,其源代码将放在 下。如果您正在执行,您可能会得到OP异常提到的。修复很简单 - 您需要将路径添加到 :phpunit.xml.dist./bin/phpunit./bin/.phpunit/phpunit-VERSIONphp ./bin/console --env=test debug:containercomposer.json

    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        },
        "classmap": [
            "tests/",
            "bin/.phpunit/phpunit-9.2.0-0/src" <--- Make sure the version is correct.
        ]
    },

之后运行,最后应该工作。composer dump-autoloadphp ./bin/console --env=test debug:container


推荐