php - Laravel 5 单元测试和命名空间

标签 php laravel namespaces phpunit

我在 Laravel 5 中使用命名空间遇到了一些有关 PHPUnit 的问题。我正在尝试对我的一条路线进行简单的测试,该路线当然会调用模型,但在调用时出现意外错误。

PHP Fatal error: Class 'Eloquent' not found in /home/app/Models/User.php on line 10

这是来自User.php的相关代码块

<?php

use Laravel\Cashier\Billable;
use Laravel\Cashier\Contracts\Billable as BillableContract;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends \Eloquent implements AuthenticatableContract, CanResetPasswordContract, BillableContract {

我在测试环境中的命名空间似乎遇到了一些问题。我不想更改我的模型,因为它完全按照我希望的方式与我的应用程序一起工作。

如何在不直接更改应用程序的情况下使 PHPUnit 环境与我的应用程序交互?

最佳答案

我的猜测是这不是命名空间问题,而是您没有(有意或无意地由于与 Laravel 认为的规范存在一些偏差)使用 Laravel 的基本测试类,或者如果您是,则您已经以某种方式修改了它们,这样您就不会在测试中引导 Laravel 环境。 (描述您如何创建测试将帮助人们追踪这一点)

问题是 Laravel 中没有全局的 Eloquent 类。然而,有一个 Eloquent 别名。如果您查看 app.php 配置文件,您将看到一组别名。

#File: config\app.php
'aliases' => [
    //...
    'Eloquent'  => 'Illuminate\Database\Eloquent\Model',
    //...

Laravel 使用内置 PHP 函数 class_alias 设置这些别名

class_alias('Illuminate\Database\Eloquent\Model', 'Eloquent');

这让您可以像使用类一样使用Eloquent。 (这实际上是通过 class alias autoloader 的方式完成的)。

由于某种原因,这在您的测试环境中没有发生。如果您无法弄清楚原因,我会在测试开始时尝试以下操作

class_alias('Illuminate\Database\Eloquent\Model', 'Eloquent');

这将手动设置别名,这可以让您运行测试。 (但是,如果您在测试中使用 Laravel 模型和其他框架功能,您真的很想弄清楚为什么您的测试环境没有引导 Laravel 环境)

关于php - Laravel 5 单元测试和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500549/

相关文章:

php - 如何在 <li> 中将 Bootstrap 徽章与 AJAX 对齐

php - 获取php中字符串的中间部分

php - mysql 获取数组(LIKE%)

xml - XSLT 命名空间和 XML 文档没有一个 - 它是如何工作的

php - 如何在 WordPress 中为其他子网站共享 WP_POST

mysql - Cloudcontrol 上的 Laravel MySQL 连接

php - 如何在存储到数据库之前自定义模型的字段

php - Laravel 4 向类添加方法(IoC/命名空间)

Python 全局命名空间值

.net - log4net - 如何仅记录来自特定 namespace 的错误