设置内部数组时,PHPUnit测试失败

时间:2012-12-19 20:54:43

标签: testing phpunit

有很多测试工作,但我对某些对象的实际测试失败了,我不知道为什么。当我在一个简单的测试中单步执行代码时,我可以看到我正在尝试测试的内容已定义,但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".

我不知道如何继续,因为当我看到对象被创建时,这会导致错误,数组填充正如我所期望的那样。我现在必须将这些测试标记为不完整,以允许我们的测试套件继续。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

经过对班级的深入检查,我找到了解决方案。我试图访问的数组被定义为PROTECTED,因此PHPUnit Test Framework无法访问该值。

有两种方法可以解决这个问题。

  1. 将数组声明为PUBLIC以使其可访问。

  2. 在测试中使用反射使其仅可用于测试。

  3. 选项2是我们的首选解决方案,但是对于项目的直接需求和其他更改的时间,临时使用了选项1(PUBLIC)。

    感谢那些帮助我解决问题的人。