Поставщик PHPUnit не работает с зависимостями - PullRequest
3 голосов
/ 14 августа 2010

Я использую PHPUnit 3.4.9, но у меня есть некоторые проблемы с аннотацией @depends.Это работает как в примерах, но прерывается, когда производитель полагается на поставщика.Я не знаю, должно ли это работать или нет, но мой код в основном имеет вид:

<?php
    class StackTest extends PHPUnit_Framework_TestCase
    {
      /**
       * @dataProvider provider
       */
      public function testEmpty ($data)
      {
        $stack = array();
        $this->assertTrue(empty($stack));

        return $stack;
      }

      /**
       * @depends testEmpty
       */
      public function testPush (array $stack)
      {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertFalse(empty($stack));

        return $stack;
      }

      /**
       * @depends testPush
       */
      public function testPop (array $stack)
      {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertTrue(empty($stack));
      }

      public function provider ()
      {
        return array(
           // Some testing data here...
        );
      }
    }

Приведенный выше код является лишь примером, но показывает структуру моего кода.При запуске он пропускает потребительские тесты, действуя так, как если бы производитель провалился.Я ожидаю, что для каждого набора данных тестирования в провайдере производитель будет работать с этими данными, и соответственно будет выполняться весь его потребитель.

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Поскольку вопросу уже 2 дня, я попробую:

Кажется, он не работает так, как вы этого хотите.

@depends просто проверяет, прошел ли тест с указанным именем, и получает результат.Он даже не знает и не заботится о @ аннотациях упомянутого теста.

Я бы предположил (недостаточно глубоко вкопался в источник phpunit, чтобы быть на 100% уверенным). Тесты с @depends запускаютсякак «группа тестов» внутри, а не как единое целое, поэтому нет теста с именем «testEmpty», и зависит от сбоев.

Так что для обеспечения обходного пути единственное, о чем я могу думать сейчас, это вызватьэти «под-тесты» напрямую.

<?php
class StackTest extends PHPUnit_Framework_TestCase {
  /**
   * @dataProvider provider
   */
  public function testEmpty($data) {
    $stack = array();
    $this->assertTrue(empty($stack));
    $this->nextTestOrJustAllInOneTestcaseSaidly($stack);
    return $stack;
  }

  protected function nextTestOrJustAllInOneTestcaseSaidly($data) { ... }

Надеюсь, что это помогает или, по крайней мере, мотивирует кого-то другого ответить;)

2 голосов
/ 14 августа 2012

У меня была точно такая же проблема с тестом, который зависит от другого теста (и более конкретно от данных, возвращаемых этим тестом), в котором используется поставщик данных.

Я преодолел проблему, установив значение (которое яобычно просто возвращается из зависимого теста) как статическая переменная, к которой я затем смог получить доступ в других моих тестах позже.

<?php
class StackTest extends PHPUnit_Framework_TestCase {
    protected static $foo;

    public function provider() { ... }

    /**
     * @dataProvider provider
     */
    public function testOne( $data ) {
        self::$foo = array();
        $this->assertTrue( empty( self::$foo ) );
    }

    /**
     * @depends testOne
     */
    public function testTwo() { 
        $this->assertTrue( empty( self::$foo ) );
    }

Все еще хакерский, но немного меньше, чем, возможно, вызов следующей функции тестаиз другого теста.

0 голосов
/ 05 октября 2012

Если в тесте есть поставщик данных, то все предоставленные данные будут включены в этот тест.Только после этого запускается следующий тест, который может зависеть от первого успешного теста.Что НЕ сделано, так это то, что все данные, предоставленные для первого теста, также передаются во второй.

@dataProvider имеет приоритет над @depends.Тест может зависеть от другого теста, который полностью проверяет все предоставленные данные, но он не получит эти данные для себя.Чтобы получить такую ​​вещь, вам действительно нужно объединить все зависимые тесты в одну функцию.

С другой стороны, такая настройка теста может быть неочевидной с самого начала, но тесты должны быть простыми для понимания.Рассмотрите возможность рефакторинга тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...