Unit testing 这个变量是如何定义的?

Unit testing 这个变量是如何定义的?,unit-testing,zend-framework,phpunit,Unit Testing,Zend Framework,Phpunit,我想知道如何在zend framework中测试模型,但在运行测试时它给了我一个错误,代码如下: 这是我要测试的模型: <?php class Application_Model_User extends Custom_Model_Base { protected $_table = 'user'; protected $_primary = array('id'); protected $_primary_ai = 'id'; protected $

我想知道如何在zend framework中测试模型,但在运行测试时它给了我一个错误,代码如下:

这是我要测试的模型:

<?php



class Application_Model_User extends Custom_Model_Base {
    protected $_table = 'user';
    protected $_primary = array('id');
    protected $_primary_ai = 'id';
    protected $_data = array();
    protected $_data_changed = array();
    protected $_readonly = array('id');
    static
    protected $_columns = array(
        'id',
        'login',
        'password_hash',
        'name',
        'surname',
        'gender',
        'street',
        'postal_code',
        'city',
        'mobile',
        'homephone',
        'email',
        'is_active');

    public function __construct() {
        parent::__construct();
    }

    static function create(array $data) {
        return parent::_create(
                $_table,
                get_class(),
                $data,
                self::$_columns,
                true
        );
    }

    static function load($id) {
        return self::_selectAndBind(
                get_class(),
                        self::getDefaultAdapter()
                        ->select()
                        ->from($_table)
                        ->where('id = ?', array($id)),
                true);
    }

    static function find($name, $order=null, $limit=null, $offset=null) {
        return self::_selectAndBind(
                get_class(),
                        self::getDefaultAdapter()
                        ->select()
                        ->from($_table)
                        ->where('name = ?', array($name))
                        ->order($order)
                        ->limit($limit, $offset)
        );
    }

}

为什么没有定义_表?实际上它是在我创建对象时定义的?如何修复它?

您将
\u$table
声明为受保护:

protected $_table = 'user';
因此,您无法通过类的实例访问它。只有继承的类才能这样做。您需要将其声明为公共的,或者使用getter/setter样式的访问

编辑:


在您的类中,您使用的是$\u表,而不是$this->\u表。这在另一个位置也是一样的。检查以确保正确访问类变量。

您将
\u$table
声明为受保护:

protected $_table = 'user';
因此,您无法通过类的实例访问它。只有继承的类才能这样做。您需要将其声明为公共的,或者使用getter/setter样式的访问

编辑:


在您的类中,您使用的是$\u表,而不是$this->\u表。这在另一个位置也是一样的。检查以确保正确访问类变量。

在静态方法
应用程序\u Model\u User::find()
中,查询中有以下行:

->来自($\表)

但在此上下文中,
$\u table
是一个永远不会设置的局部变量。听起来您想访问
$this->\u表


[作为旁注:由于您已将
find()
定义为静态方法,因此在静态调用期间尝试引用
$this
时可能会遇到问题。当然,在测试中,您似乎确实在实例上调用了
find()
,因此在这方面应该没有问题。您真的需要
find()
是否成为静态方法?]

在静态方法
应用程序\u Model\u User::find()
中,查询中有以下行:

->来自($\表)

但在此上下文中,
$\u table
是一个永远不会设置的局部变量。听起来您想访问
$this->\u表



[作为旁注:由于您已将
find()
定义为静态方法,因此在静态调用期间尝试引用
$this
时可能会遇到问题。当然,在测试中,您似乎确实在实例上调用了
find()
,因此在这方面应该没有问题。您真的需要
find()
是否成为静态方法?]

将受保护的$\u表更改为公共$\u表,但仍然是相同的错误,更新了更多信息。当访问类变量时,您需要使用
$this->variable
。我将受保护的$\u表在应用程序\u Model\u User和自定义\u Model\u基类中都更改为public,但它给出了相同的错误我更改了它,但它给出了“PHP致命错误:不在对象上下文中使用$this”,无法在对象中使用$this?因为您需要在静态方法中使用
$\u table
,请使用
const table='user'将其移动到类常量和静态方法中的
self::TABLE
。将受保护的$\u表更改为公共$\u表,但仍然是相同的错误,更新了更多信息。当访问类变量时,您需要使用
$this->variable
。我将受保护的$\u表在应用程序\u Model\u User和自定义\u Model\u基类中都更改为public,但它给出了相同的错误我更改了它,但它给出了“PHP致命错误:不在对象上下文中使用$this”,无法在对象中使用$this?因为您需要在静态方法中使用
$\u table
,请使用
const table='user'将其移动到类常量位于顶部,在静态方法中使用
self::TABLE
。在某些情况下,我看到您使用
Application\u Model\u User2
而不是1
Application\u Model\u User
。我想这只是一个输入错误?@david,是的,david,这是一个输入错误在某些情况下,我看到您使用的是
Application\u Model\u User2
,而不是1
Application\u Model\u User
。我假设这只是一个输入错误?@david,是的,david,这是一个输入错误我只是测试别人写的代码,所以我不能更改find()的访问说明符,在基类中,它提供了_set和_get方法,那么我如何在不更改访问说明符的情况下解决这个问题呢?我不知道当考试看起来不及格时该怎么办。单元测试的具体用途是什么。;-)但是应用程序运行时没有问题,我看不到这个模型代码实际上是如何工作的,它引用了未设置的局部变量
$\u table
。也许生产模式下的应用程序正在抑制/捕获错误,而
\u selectAndBind()
方法正在使用某种魔法来处理丢失的表名?我也对此感到困惑,构造函数受到保护,我甚至不知道如何创建它的对象,这真是愚蠢的代码我只是测试了其他人编写的代码,因此,我无法更改find()的访问说明符,在基类中,它提供了_set和_get方法,那么如何在不更改访问说明符的情况下解决问题?我不知道当考试看起来不及格时该怎么办。单元测试的具体用途是什么。;-)但是应用程序运行时没有问题,我看不到这个模型代码实际上是如何工作的,它引用了未设置的局部变量
$\u table
。也许生产模式下的应用程序正在抑制/捕获错误,而
\u selectAndBind()
方法正在使用某种魔法来处理丢失的表名?我也对此感到困惑,构造函数是受保护的,我甚至不知道如何创建它的对象,这真是愚蠢的代码
1) Model_User2Test::testCanFind
Undefined variable: _table
application\models\User2.php:57
tests\application\models\User2Test.php:27
protected $_table = 'user';
static function load($id) {
    return self::_selectAndBind(
            get_class(),
                    self::getDefaultAdapter()
                    ->select()
                    // $this->_table not $table
                    ->from($_table)
                    ->where('id = ?', array($id)),
            true);
}