有很多测试工作,但我对某些对象的实际测试失败了,我不知道为什么。当我在一个简单的测试中单步执行代码时,我可以看到我正在尝试测试的内容已定义,但PHPUnit未通过测试。
我在下面编辑了一些小代码示例,试图在没有太多噪音的情况下说明问题。
类定义的非常简单的子集。
class UTIL_CATEGORY_SCOPE extends UTIL_MESSAGE_DATA
{
function __construct($CategoryNo = NULL, $CategoryName = NULL)
{
$this->DeclareClassFields_();
$this->CategoryName = $CategoryName;
$this->CategoryNo = $CategoryNo;
}
private function DeclareClassFields_()
{
$this->Fields['CategoryNo'] = new UTIL_ICAP_FIELD('CCL', 6, 'Category', 8);
$this->Fields['SubCategoryNo'] = new UTIL_ICAP_FIELD('SCC', 6, 'Sub-Category', 12);
$this->Fields['SubSubCategoryNo'] = new UTIL_ICAP_FIELD('SSC', 6, 'Sub-Sub-Category', 12);
}
}
Netbeans调试器中的普通代码可以看到这种方法。
$Category = new UTIL_CATEGORY_SCOPE();
转储内容以便比较接下来的PHPUnit测试样本。
var_dump($Category);
class UTIL_CATEGORY_SCOPE#1 (4) {
public $TheMessage_ =>
class MESSAGE_DATA#2 (0) {
}
这没关系。预期和工作,因为类InstanceOf可以测试并正确传递。
在内部,有一个在数组中维护的字段列表,这是一个类对象数组,它使用魔术方法获取/设置值等等......数组是否已初始化?
var_dump($Category->Fields);
array(3) {
'CategoryNo' =>
class UTIL_ICAP_FIELD#3 (14) {
public $FieldCode =>
string(3) "CCL"
public $FieldLength =>
int(6)
public $FieldTitle =>
string(8) "Category"
}
'SubCategoryNo' =>
class UTIL_ICAP_FIELD#4 (14) {
public $FieldCode =>
string(3) "SCC"
public $FieldLength =>
int(6)
public $FieldTitle =>
string(12) "Sub-Category"
}
'SubSubCategoryNo' =>
class UTIL_ICAP_FIELD#5 (14) {
public $FieldCode =>
string(3) "SSC"
public $FieldLength =>
int(6)
public $FieldTitle =>
string(16) "Sub-Sub-Category"
}
}
按预期初始化数组 检查数组是否存在以及是否可以访问各个项目。
if (array_key_exists('CategoryNo', $Category->Fields))
echo 'Array Key Exists';
Array Key Exists
if( $Category->Fields['CategoryNo'] instanceof UTIL_ICAP_FIELD )
echo 'Yes';
Yes
所有人都按预期报告。
PHPUnit测试部分:
class TEST_UTIL_CATEGORY_SCOPE extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
}
public function testObjectCreation()
{
$CategoryInfo = new UTIL_CATEGORY_SCOPE();
$this->assertInstanceOf('UTIL_CATEGORY_SCOPE', $CategoryInfo);
$this->assertInstanceOf('UTIL_DATA_STRUCTURE', $CategoryInfo);
}
public function testConstructFieldOrder()
{
$CategoryInfo = new UTIL_CATEGORY_SCOPE(1500, 'Category Name');
$this->assertEquals(1500, $CategoryInfo->CategoryNo);
$this->assertEquals('Category Name', $CategoryInfo->CategoryName);
}
/**
*
*/
public function testConstructDefaults()
{
$CategoryInfo = new UTIL_CATEGORY_SCOPE();
$this->assertNull($CategoryInfo->CategoryNo);
$this->assertNull($CategoryInfo->CategoryName);
}
这些测试按预期通过。但是,考虑到上面的信息转储,以下2个测试失败,即使测试运行和var_dump显示值已初始化并按预期显示。
public function testFieldsCreated()
{
$CategoryInfo = new UTIL_CATEGORY_SCOPE();
$this->assertArrayHasKey('CategoryNo', $CategoryInfo->Fields);
$this->assertArrayHasKey('SubCategoryNo', $CategoryInfo->Fields);
$this->assertArrayHasKey('SubSubCategoryNo', $CategoryInfo->Fields);
}
创建的错误:
1) TEST_UTIL_CATEGORY_SCOPE::testFieldsCreated
Failed asserting that an array has the key 'CategoryNo'.
下一个测试
public function testICAPFieldTypes()
{
$CategoryInfo = new UTIL_CATEGORY_SCOPE();
$this->assertInstanceOf('UTIL_ICAP_FIELD', $CategoryInfo->Fields['CategoryNo']);
$this->assertInstanceOf('UTIL_ICAP_FIELD', $CategoryInfo->Fields['SubCategoryNo']);
$this->assertInstanceOf('UTIL_ICAP_FIELD', $CategoryInfo->Fields['SubSubCategoryNo']);
}
创建的错误:
2) TEST_UTIL_CATEGORY_SCOPE::testICAPFieldTypes
Failed asserting that null is an instance of class "UTIL_ICAP_FIELD".
我不知道如何继续,因为当我看到对象被创建时,这会导致错误,数组填充正如我所期望的那样。我现在必须将这些测试标记为不完整,以允许我们的测试套件继续。
有没有人有任何想法?
答案 0 :(得分:0)
经过对班级的深入检查,我找到了解决方案。我试图访问的数组被定义为PROTECTED,因此PHPUnit Test Framework无法访问该值。
有两种方法可以解决这个问题。
将数组声明为PUBLIC以使其可访问。
在测试中使用反射使其仅可用于测试。
选项2是我们的首选解决方案,但是对于项目的直接需求和其他更改的时间,临时使用了选项1(PUBLIC)。
感谢那些帮助我解决问题的人。