0

多数のテストが機能していますが、一部のオブジェクトの実際のテストが失敗しており、理由がわかりません。簡単なテストでコードをステップスルーすると、テストしようとしているものが定義されていることがわかりますが、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);
    }

これらのテストは期待どおりに合格します。ただし、上記の情報のダンプを考えると、テストの実行とvar_dumpで値が初期化され、期待どおりに存在することが示されていても、次の2つのテストは失敗します。

    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".

オブジェクトが作成され、配列が期待どおりに入力されていることがわかると、エラーが発生するため、続行する方法がわかりません。テストスイートを続行できるようにするには、これらのテストを今のところ未完了としてマークする必要があります。

誰かアイデアはありますか?

4

1 に答える 1

0

クラスを詳しく調べた結果、解決策が見つかりました。アクセスしようとした配列はPROTECTEDとして定義されていたため、PHPUnitテストフレームワークは値にアクセスできませんでした。

これを回避するための2つの解決策があります。

  1. アレイをPUBLICとして宣言して、アクセス可能にします。

  2. テストでのみReflectionを使用して、テストでのみアクセスできるようにします。

オプション2が推奨されるソリューションですが、プロジェクトの当面のニーズとその他の変更のために、オプション1(PUBLIC)が一時的に使用されました。

私の問題を解決するのを手伝ってくれた人々に感謝します。

于 2013-01-02T16:30:36.080 に答える