PHPUnit 3.7 在 Laravel 4.1 中找不到控制器类

Posted

技术标签:

【中文标题】PHPUnit 3.7 在 Laravel 4.1 中找不到控制器类【英文标题】:PHPUnit 3.7 can't find Controller Classes in Laravel 4.1 【发布时间】:2014-01-02 05:51:25 【问题描述】:

设置 1:在 phpUnit 中从路由回响工作

routes.php

Route::get('signup', function()
    return "Hello World!";
);

/tests/SignupTest.php

class SignupTest extends TestCase 
    public function testIndex()
        $this->call('GET', 'signup');
        $this->assertResponseOK();
    

运行 PHPUnit 会返回以下内容:

OK (1 test, 1 assertion)

设置 2:但是当我路由到它时 PHPUnit 找不到注册控制器

routes.php

Route::get('signup', array('uses' => 'Signup@process'));

/app/controllers/Signup.php

class Signup extends BaseController 
    public function process()
        echo  "Hello World!";
    

/tests/SignupTest.php

class SignupTest extends TestCase 
    public function testIndex()
        $this->call('GET', 'signup');
        $this->assertResponseOK();
    

PHPUnit 返回以下内容:

There was 1 error:

1) SignupTest::testIndex
ReflectionException: Class Signup does not exist

/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:476
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:416
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:423
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:77
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:50
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php:900
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Routing/Route.php:118
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php:964
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php:934
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:677
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:652
/Applications/MAMP/htdocs/laravel/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:82
/Applications/MAMP/htdocs/laravel/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:319
/Applications/MAMP/htdocs/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:74
/Applications/MAMP/htdocs/laravel/app/tests/SignupTest.php:12

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

设置信息:

Laravel 4.1 PHPUnit 3.7.28 均由 Composer 安装 MAMP 在 Mac OS X 10.8 上运行 PHP 5.4.4

我认为我没有更改 Laravel 或 PHPUnit 的核心/配置文件中的任何内容。

我尝试过的事情:

我找到了一些关于此类问题的答案(在 SO 和其他网站上),其中的答案建议修复类/文件/方法名称中的错误,例如:

Laravel Controller not working

我认为这不是问题,因为我已经检查了所有名称。 它还返回“Hello World!”在浏览器中测试时,上述两条路由都符合预期,这表明该路由在 Laravel 中运行良好。问题似乎出在 PHPUnit 上。

我的问题:为什么 PHPUnit 在 app/controllers 中找不到 Signup Class?

【问题讨论】:

【参考方案1】:

我假设因为在基本的 Laravel 安装中有一个 phpunit.xml 文件,PHPUnit 会知道它。结果证明这个假设是不正确的。

问题

PHPUnit 未加载 phpunit.xml,这意味着 bootstrap/autoload.php 中的引导文件未加载,因此 PHPUnit 不知道任何类文件的位置,包括 Signup.php

解决方案

我在运行 PHPUnit 时在 --configuration 开关中添加了 phpunit.xml 的文件路径:

--configuration /Applications/MAMP/htdocs/laravel/phpunit.xml

一般建议

如果 PHPUnit 告诉您它找不到类,请检查它是否正在加载 phpunit.xml 和/或您的引导文件。确保您的 phpunit.xml 文件正确指向您的引导文件,并且您的引导文件已正确配置以加载所需的类。

另外,正如我在问题中所指出的,问题也可能是由类/文件/方法名称之间的不一致引起的。

【讨论】:

以上是关于PHPUnit 3.7 在 Laravel 4.1 中找不到控制器类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.5 中运行 phpunit

如何在Laravel项目中安装PHPunit

在 Laravel 的 Homestead 中运行 PHPUnit

将 phpunit 安装到 Laravel 4 站点

无法在cpanel上上传phpunit Laravel文件

在没有 /vendor/bin/ 的 laravel 4 中使用 phpunit