простой класс карты не терпит неудачу, как при развертывании

#php #phpunit

#php #phpunit

Вопрос:

Я работаю над некоторым старым кодом php. в среде разработки и error_reporting при включении E_ALL | E_STRICT я получаю Notice: Undefined offset: 4 in /home/pgnetdev/www/PGNet/php-includes/base_classes.inc on line 545

нарушающий php-класс

 <?php
class CMap
{
    var $m_aData;
    var $m_aKeys;
    var $m_iNumItems;
    var $m_iCurrentDatumIndex;

    function CMap()
    {
        $this->m_aData = array();
        $this->m_aKeys = array();
        $this->m_iNumItems = 0;
        $this->m_iCurrentDatumIndex = 0;
    }

    function Add($strKey, amp; $clDatum)
    {
        if ($this->Contains($strKey))
            return false;
        $this->m_aKeys[$strKey] = $strKey;
        $this->m_iNumItems  ;
        $this->m_aData[$strKey] = amp; $clDatum;
        return true;
    }
    function amp;First()
    {
        if ($this->m_iNumItems <= 0)
            return null;
        sort($this->m_aKeys);
        $this->m_iCurrentDatumIndex = 0;
        return $this->m_aData[$this->m_aKeys[0]];
    }
    //line 545 in this method
    function amp;Next()
    {
        fwrite(STDERR, " [NEXT]: {$this->m_iCurrentDatumIndex} >= {$this->m_iNumItems}n"); //not deployed
        if ($this->m_iCurrentDatumIndex >= $this->m_iNumItems)
        {
            fwrite(STDERR, "-[NEXT]: returning nulln");// not deployed
            return null;
        }
        fwrite(STDERR, "-[NEXT]: returning valuen"); //not deployed
        return $this->m_aData[$this->m_aKeys[  $this->m_iCurrentDatumIndex]];// line 545
    }
    function amp;Find($strKey)
    {
        if (array_key_exists($strKey, $this->m_aData))
            return $this->m_aData[$strKey];
        return null;
    }
    function Contains($strKey)
    {
        return array_key_exists($strKey, $this->m_aData);
    }

    function Items()
    {
        return $this->m_iNumItems;
    }
}
  

мои тесты для него

 <?php
error_reporting(E_ALL | E_STRICT);

require_once '../PGNet/php-includes/base_classes.inc';

class CMapTest extends PHPUnit_Framework_TestCase
{
    public function testItemsReturnsNumberOfItemsAdded()
    {
        $map = new CMap();
        $var = 1;
        $this->assertEquals(0, $map->Items(), 'No Items, Zero Count expected');
        $map->Add("KEY", $var);

        $this->assertEquals(1, $map->Items(), 'Item just added, should have count 1');
    }

    public function testContainsReturnsTrueIfMapContainsKey()
    {
        $map = new CMap();
        $var = 1;
        $this->assertFalse($map->Contains("KEY"), 'No Items, No KEYS');
        $map->Add("KEY", $var);

        $this->assertTrue($map->Contains("KEY"), 'Item just added, should a key');
    }

    public function testFindReturnsNullIfMapDoesntContainsKey()
    {
        $map = new CMap();
        $var = 1;
        $map->Add("KEY", $var);

        $actual = $map->Find("NO_KEY");

        $this->assertEquals(null, $actual, 'no key no value... NULL is expected here');
    }

    public function testFindReturnsValueIfMapContainsKey()
    {
        $map = new CMap();
        $var = 1;
        $map->Add("KEY", $var);

        $actual = $map->Find("KEY");

        $this->assertEquals($var, $actual, 'has key finds value... var is expected here');
    }

    public function testAddReturnsFalseIfKeyIsAlreadyAdded()
    {
        $map = new CMap();
        $var1 = 1;
        $var2 = 2;

        $willBeTrue = $map->Add("KEY", $var1);
        $willBeFalse = $map->Add("KEY", $var2);

        $this->assertTrue($willBeTrue, "first key added should always be true");
        $this->assertFalse($willBeFalse, "key already exists so you cant replace it");
    }

    public function testFirstReturnsNullWhenNoItemsAdded()
    {
        $map = new CMap();

        $actual = $map->First();

        $this->assertEquals(null, $actual, 'no items added, returns false');
    }

    public function testFirstReturnsFirstSortedValue()
    {
        $map = new CMap();
        $var1 = 1;
        $var2 = 2;
        $map->Add("B", $var2);
        $map->Add("A", $var1);

        $actual = $map->First();

        $this->assertEquals($var1, $actual, 'keys are sorted then first one is grabbed');
    }

    public function testNextReturnsNullIfOnlySingleItemAdded()
    {
        $map = new CMap();
        $var1 = 1;
        $map->Add("A", $var1);

        $actual = $map->First();

        $this->assertEquals($var1, $actual, 'keys are sorted then first one is grabbed');
        $this->assertEquals(null, $map->Next());
    }

    public function testNextReturnsNullAfterAllItemsAreIteratedThrough()
    {
        fwrite(STDERR, " [testNextReturnsNullAfterAllItemsAreIteratedThrough]n");

        $map = new CMap();
        $var1 = 1;
        $var2 = 2;
        $map->Add("B", $var2);
        $map->Add("A", $var1);

        $actual = $map->First();
        $loopCount = 0;
        try
        {
            for($actual = $map->First(); $actual != null; $actual = $map->Next())
            {
                $this->assertNotNull($actual);
                $loopCount  ;
            }
        }
        catch (Throwable $th)
        {
            fwrite(STDERR, "-[testNextReturnsNullAfterAllItemsAreIteratedThrough]:WTHn");

            $this->assertFalse(true, $th->getMessage());
        }
        $this->assertEquals(2, $loopCount, "the for loop should work");
        fwrite(STDERR, "-[testNextReturnsNullAfterAllItemsAreIteratedThrough]n");
    }
}

  

Последний тест здесь — это то, что меня действительно озадачило, почему он не ломается, не выбрасывается или что-то в этом роде. вывод на консоль для этого

 $ phpunit ../PGNetTests/tests/unitTests/
PHPUnit @package_version@ by Sebastian Bergmann.

....................................................... [NEXT]: 0 >= 1
-[NEXT]: returning value
. [testNextReturnsNullAfterAllItemsAreIteratedThrough]
 [NEXT]: 0 >= 2
-[NEXT]: returning value
 [NEXT]: 1 >= 2
-[NEXT]: returning value
-[testNextReturnsNullAfterAllItemsAreIteratedThrough]
.... 60 / 88
.......................... [NEXT]: 0 >= 1
-[NEXT]: returning value
..

Time: 0 seconds, Memory: 4.25Mb

OK (88 tests, 326 assertions)
  

например, я ожидал бы либо получить то же сообщение на выходе, что и в рабочей среде, либо, по крайней мере, выдать исключение или даже -[NEXT] return null но я не получаю ничего, кроме прохождения тестов, и я не знаю почему. Почему???

Комментарии:

1. PHPUnit @package_version@ by Sebastian Bergmann предлагает использовать версию PHPUnit, которая была упакована для установки с помощью установщика PEAR, но не установлена с помощью установщика PEAR. В любом случае: он старый и не поддерживается.

2. @SebastianBergmann я не мог поверить своим глазам, когда увидел, как вы прокомментировали. Так что да, я использую очень старую версию phpunit (не по выбору) Я также не смог использовать какую-либо другую версию. Одна из причин заключается в том, что наш сервер сборки использует 3.4, а мы используем php 5.4. Это сообщение об ошибке было очень неприятным. Я пытался заставить phpstorm использовать phpunit-3.7.phar, но он продолжал пытаться делать что-то свое и не использовать файл phar:/ однако я чувствую, что это не проблема с phpunit. но вам лучше знать. Ваше внутреннее чувство говорит, что это, возможно, phpunit?