使用 PHP 8.1 修复 Laravel 8 中的“Command Test is Not Defined”

Artisan

了解 Laravel 8 中的 Artisan 测试命令错误

开发人员在使用 Laravel 8 和 PHP 8.1 时面临的一个常见问题是“命令‘test’未定义”错误。当尝试使用“php artisan test”命令运行自动化测试时,经常会出现此问题。乍一看,这似乎是一个简单的命令缺失问题,但实际上还有更多问题。

在许多情况下,开发人员添加“nunomaduro/collision”包来更好地处理测试异常。然而,由于 Laravel、PHP 和 PHPUnit 之间的版本兼容性,这又引入了另一层复杂性。随着 PHP 的不断发展,新版本有时会破坏旧的依赖关系。

核心问题源于“nunomaduro/collision”与 PHP 8.1 所需的 PHPUnit 版本之间的冲突。 Collision 包需要 PHPUnit 9,但 PHP 8.1 需要 PHPUnit 10,从而导致兼容性问题,导致测试命令无法按预期运行。

在本文中,我们将探讨此问题的根本原因,讨论这些包之间的兼容性问题,并提供一个解决方案,让您的测试在 PHP 8.1 的 Laravel 8 中再次顺利运行。

命令 使用示例和说明
composer show 此命令显示项目依赖项的已安装版本。在这种情况下,它用于检查安装了哪个版本的 PHPUnit,这对于解决版本不匹配的问题至关重要。
composer clear-cache 清除 Composer 用于加速依赖项安装的缓存。这在更新或解决依赖冲突时非常有用,因为它强制 Composer 获取包的新副本。
composer update 根据composer.json文件更新项目的依赖项。在本例中,它用于在修改版本约束后应用对 PHPUnit 和 nunomaduro/collision 的更改以解决兼容性问题。
php artisan make:test 在 Laravel 的测试套件中生成一个新的测试文件。此命令用于创建单元或功能测试,如实施单元测试以验证环境设置的解决方案中所示。
php artisan test 在 Laravel 项目中运行测试套件。这是本文的核心问题,由于 PHPUnit 和 Collision 版本不匹配,命令失败。
brew install php@8.0 特定于使用 Homebrew 的 macOS 系统,此命令安装 PHP 8.0。当需要降级 PHP 来匹配 PHPUnit 9 和 nunomaduro/collision 5.0 等依赖项时,这是一个解决方案。
brew link --overwrite 此命令用于将特定 PHP 版本(本例中为 PHP 8.0)链接到您的系统,确保它覆盖当前 PHP 版本,从而解决环境中的版本不匹配问题。
response->response->assertStatus() Laravel 特定的测试方法。它检查 HTTP 响应状态是否符合预期。在示例中,它用于验证主页路由是否返回状态代码 200,从而确认服务器配置正确。
php -v 显示当前 PHP 版本。此命令对于确认正在使用正确的 PHP 版本至关重要,特别是在解决不同版本的 PHP 和依赖项之间的兼容性问题时。

解决 Laravel 8 中的 PHPUnit 和冲突兼容性

我提供的第一个脚本通过调整项目的依赖关系解决了“命令'test'未定义”错误的核心问题。此错误的主要原因在于 PHP、PHPUnit 和 nunomaduro/collision 之间的版本不匹配。该解决方案首先使用以下命令检查 PHPUnit 的当前版本 命令。此步骤对于识别已安装的版本并了解它是否满足您的 Laravel 设置所需的版本至关重要。确认版本后,我们修改composer.json文件,确保安装了正确版本的PHPUnit和Collision,避免运行时出错 。

在这种情况下,最佳解决方案是需要 PHPUnit 9.5,它与 nunomaduro/collision 5.0 保持一致。调整composer.json文件后,我们运行 命令,该命令应用必要的更改并更新项目中的包版本。此外,还有一种替代解决方案,需要将 Collision 升级到版本 6.x,以便与 PHPUnit 10 兼容。这种方法很重要,因为它可以确保您的项目保持最新测试工具的更新,同时仍然与 PHP 8.1 兼容。

第二个解决方案探讨降级 PHP 版本,特别是降级到 PHP 8.0。此方法通过使环境与依赖项保持一致来解决版本不匹配的问题。通过使用 命令,我们安装 PHP 8.0,然后 命令将活动 PHP 版本切换到 8.0。这是必要的,因为 PHP 8.1 需要 PHPUnit 10,这与 Collision 5.0 冲突。通过降级 PHP,我们调整了所有必要工具的版本,使您能够毫无错误地运行测试。

最后,我提供了使用的单元测试示例 和 。这些命令对于确保正确配置 Laravel 环境以运行测试至关重要。单元测试有助于验证对 PHP、PHPUnit 和 Collision 所做的更改是否已成功解决问题。通过运行断言真实条件或检查 HTTP 响应的简单测试,我们确认测试设置按预期工作。这种使用单元测试进行验证的过程是最佳实践,可确保您的项目在任何环境更改后顺利运行。

通过调整依赖关系解决 Laravel Artisan 测试命令错误

使用 Composer 的解决方案以及后端的依赖调整

// First, check the current PHPUnit version in composer.json
composer show phpunit/phpunit

// If the version is incorrect, modify composer.json to require PHPUnit 9 (for Collision)
// Add this in the require-dev section of composer.json
"phpunit/phpunit": "^9.5"

// Ensure that nunomaduro/collision is updated to match with PHPUnit 9
"nunomaduro/collision": "^5.0"

// Run composer update to install the new versions
composer update

// Now you should be able to run the tests using
php artisan test

// If you want to force the use of PHPUnit 10, upgrade nunomaduro/collision to 6.x
"nunomaduro/collision": "^6.0"

// Run composer update again to apply the changes
composer update

通过降级 PHP 处理 Laravel PHPUnit 版本不匹配

通过降级PHP版本以实现兼容性的解决方案

// Step 1: Check current PHP version
php -v

// Step 2: If using PHP 8.1, consider downgrading to PHP 8.0
// This allows compatibility with PHPUnit 9, which is required by Collision 5.0

// Step 3: Install PHP 8.0 using your package manager (e.g., Homebrew for Mac)
brew install php@8.0

// Step 4: Switch your PHP version to 8.0
brew link --overwrite php@8.0

// Step 5: Verify the new PHP version
php -v

// Step 6: Clear composer cache and update dependencies
composer clear-cache
composer update

// Step 7: Now you can run artisan tests without version issues
php artisan test

实施单元测试来验证 Artisan Test Command 的解决方案

PHPUnit 单元测试用于在不同环境中验证测试命令

// Create a simple unit test in Laravel to check basic functionality
php artisan make:test ExampleTest

// In tests/Feature/ExampleTest.php, write a simple test
public function testBasicTest() {
    $this->assertTrue(true);
}

// Run the test to ensure it works with PHPUnit
php artisan test

// Another test for checking HTTP response
public function testHomePage() {
    $response = $this->get('/');
    $response->assertStatus(200);
}

// Run the tests again to validate this new scenario
php artisan test

探索 Laravel 8 测试环境中的依赖冲突

故障排除时的一个关键方面 Laravel 8 与 PHP 8.1 中的命令正在了解依赖项如何交互。 Laravel 作为一个框架,依赖于多个第三方库才能有效运行。当这些库,例如 和 ,版本与PHP版本不匹配,可能会出现错误。当 Laravel 升级其组件或发布新版本的 PHP 时,经常会出现这些版本不匹配的情况,从而引入更严格的要求。

这 是开发过程中处理异常和改进错误消息的重要工具。但是,当它需要 PHPUnit 9 但您的 PHP 版本 (8.1) 强制要求 PHPUnit 10 时,您就会陷入必须升级软件包或降级 PHP 的情况。重要的是要了解升级所有软件包并不总是最好的解决方案,因为它可能会引入新的错误,尤其是在处理遗留项目时。这就是为什么一些开发人员更愿意留在 PHP 8.0 以避免这些冲突引起的潜在问题。

除了管理这些依赖冲突之外,设置正确的依赖关系也很重要 环境。通过 PHPUnit 和 Laravel 的内置测试工具编写和运行简单的测试,您可以在开发周期的早期发现错误。这可以确保当您解决版本冲突时,您的应用程序保持稳定。此外,在 Laravel 项目中保持强大的测试文化有助于保证依赖项的任何更改都不会引入不可预见的问题,从而使您的开发过程更加可靠。

  1. 如何解决 Laravel 中的“命令‘测试’未定义”错误?
  2. 该错误通常是由版本之间的不匹配引起的 和 。更新您的依赖项 和跑步 composer update 可以解决问题。
  3. 我应该使用什么版本的 PHP 和 PHPUnit 来进行 Laravel 8 测试?
  4. 对于 Laravel 8,建议使用 PHP 8.0 或更低版本 ,或更新为 与 PHP 8.1 兼容 。
  5. 我可以在不升级到 PHPUnit 10 的情况下运行测试吗?
  6. 是的,您可以降级到 或锁定您的 打包到版本 5.x,支持 PHPUnit 9。
  7. 如何检查我当前的 PHPUnit 版本?
  8. 跑步 查看 Laravel 项目中已安装的 PHPUnit 版本。
  9. 如何降级本地开发环境中的 PHP?
  10. 如果您在 macOS 上使用 Homebrew,则可以使用以下命令安装 PHP 8.0 并将其链接到 。

在使用 PHP 8.1 的 Laravel 8 中运行测试时,PHPUnit 和 nunomaduro/collision 之间的版本冲突可以通过升级或降级依赖项来解决。正确管理这些依赖项可确保测试运行更顺畅并减少错误。

通过正确的调整,无论是通过升级碰撞包还是降级到 PHP 8.0,都可以快速解决“命令‘测试’未定义”错误。这使您可以更加专注于 Laravel 项目的开发和测试,而不会中断。

  1. 详细阐述了 Laravel 的测试工具和依赖管理提供的版本冲突和解决方案: Laravel 测试文档
  2. 有关处理 PHP 版本冲突和管理 PHPUnit 依赖项的信息: PHPUnit 官方网站
  3. 有关 nunomaduro/collision 及其对 Laravel 应用程序的兼容性要求的详细信息: nunomaduro/碰撞 GitHub 存储库
  4. 在 macOS 上降级 PHP 并安装特定版本的命令: 自制文档