Unit testing 这个变量是如何定义的?
我想知道如何在zend framework中测试模型,但在运行测试时它给了我一个错误,代码如下: 这是我要测试的模型: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 $
<?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'将其移动到类常量顶部的code>和静态方法中的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
而不是1Application\u Model\u User
。我想这只是一个输入错误?@david,是的,david,这是一个输入错误在某些情况下,我看到您使用的是Application\u Model\u User2
,而不是1Application\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);
}