Phpunit: Конструктор в подклассе PHPUnit_Framework_TestCase вызывает разрыв @dataProvider

Созданный на 9 авг. 2012  ·  4Комментарии  ·  Источник: sebastianbergmann/phpunit

Наличие конструктора в вашем тесте приводит к тому, что аннотация dataProvider прерывается с ошибкой об отсутствующих аргументах:

PHPUnit 3.6.12 by Sebastian Bergmann.

...E

Time: 0 seconds, Memory: 3.25Mb

There was 1 error:

1) Test::testTheProvider
Missing argument 1 for Test::testTheProvider()

/home/nick/development/PHP-1.php:43

FAILURES!
Tests: 4, Assertions: 5, Errors: 1.

Удаление конструктора заставляет testTheProvider снова работать и, похоже, не нарушает аннотации @depends .

<?php
class Test extends PHPUnit_Framework_TestCase {

    public function __construct() {
        parent::__construct();
    }

    public function testEmpty() {
        $stack = array();
        $this->assertEmpty($stack);

        return $stack;
    }

    /**
     * <strong i="10">@depends</strong> testEmpty
     */
    public function testPush(array $stack) {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertNotEmpty($stack);

        return $stack;
    }

    /**
     * <strong i="11">@depends</strong> testPush
     */
    public function testPop(array $stack) {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEmpty($stack);
    }

    public function theProvider() {
        return array(
            array(true, false)
        );
    }

    /**
     * <strong i="12">@dataProvider</strong> theProvider
     */
    public function testTheProvider($var1, $var2) {
        //$var1 = true;
        //$var2 = false;

        $this->assertNotEquals($var1, $var2);
    }

}
?>

Самый полезный комментарий

Я решил проблему следующим образом:

класс Test расширяет PHPUnit_Framework_TestCase {
публичная функция __construct($name = NULL, массив $data = array(), $dataName = '') {
parent::__construct($name, $data, $dataName);
}
}

Все 4 Комментарий

Ожидаемое поведение. Если вы переопределяете PHPUnit_Framework_TestCase::__construct() (чего делать не следует), ваша реализация должна принять все аргументы исходной реализации и передать их parent::__construct() .

Спасибо за разъяснение. Однако конструктор в PHPUnit_Framework_TestCase предоставляет значения по умолчанию для своих аргументов, и в любом случае они определены одинаково. Вызов этого не должен иметь значения, если вы специально не хотите что-то изменить.

Более того, это не упоминается в документах (http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.PHPUnit_Framework_TestCase), а образец DBUnit BankAccount даже делает это (https:/ /github.com/sebastianbergmann/dbunit/blob/master/Samples/BankAccountDB/BankAccountDBTest.php#L60).

Я бы не сказал, что это ожидаемое поведение, если некоторые аннотации работают, а некоторые нет только из-за этого.

Я решил проблему следующим образом:

класс Test расширяет PHPUnit_Framework_TestCase {
публичная функция __construct($name = NULL, массив $data = array(), $dataName = '') {
parent::__construct($name, $data, $dataName);
}
}

Привет,
Мне повезло найти этот ответ, сэкономив много времени. Тай, @foued611

Мой случай такой, и он терпит неудачу.

# my base test class
use PHPUnit_Framework_TestCase;

class mytest extends PHPUnit_Framework_TestCase {
   public function __construct() {
     # do some common stuff to my tests...
  }
}


class IntegrationTest extends mytest {
  public function __construct() {
     parent::__construct();
  }
   /**
    * <strong i="9">@dataProvider</strong> additionProvider
    */
    public function testAdd($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
            'adding zeros'  => [0, 0, 0],
            'zero plus one' => [0, 1, 1],
            'one plus zero' => [1, 0, 1],
            'one plus one'  => [1, 1, 3]
        ];
    }

}

исправленная и рабочая версия выглядит так

# my base test class
use PHPUnit_Framework_TestCase;

class mytest extends PHPUnit_Framework_TestCase {
   public function __construct() {
     # do some common stuff to my tests...
    parent::__construct(...func_get_args());
  }
}


class IntegrationTest extends mytest {
  public function __construct($name = NULL, array $data = array(), $dataName = '') {
    parent::__construct(...func_get_args());
  }
   /**
    * <strong i="13">@dataProvider</strong> additionProvider
    */
    public function testAdd($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
            'adding zeros'  => [0, 0, 0],
            'zero plus one' => [0, 1, 1],
            'one plus zero' => [1, 0, 1],
            'one plus one'  => [1, 1, 3]
        ];
    }

}

Текущая документация PHPUnit никоим образом не предупреждает, что не добавляется пользовательский __constructor() для ваших тестовых классов, которые используют dataProvider. Эту информацию можно добавить в текущую документацию поставщиков данных, по крайней мере, она даст вам подсказку, почему ваша реализация не работает, даже если вы скопировали и вставили пример кода поставщика данных.
И если вам нужно использовать собственный __constructor, добавьте руководство, как его можно сделать так, чтобы он работал.

Пинг, потому что закрыт @sebastianbergmann

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

sebastianbergmann picture sebastianbergmann  ·  4Комментарии

gellis picture gellis  ·  4Комментарии

stephen-leavitt-sonyatv-com picture stephen-leavitt-sonyatv-com  ·  4Комментарии

sebastianbergmann picture sebastianbergmann  ·  4Комментарии

greg0ire picture greg0ire  ·  4Комментарии