PHPUnit 提供程序无法使用依赖项

rov*_*ghn 6 php phpunit

我正在使用 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...
        );
      }
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码只是一个示例,但显示了我的代码的结构。运行时,它会跳过消费者测试,就像生产者失败一样。我期望对于提供者中的每组测试数据,生产者将使用该数据运行,并且其所有消费者也相应地运行。

edo*_*ian 3

由于问题已经出现两天了,我试一下:

它似乎没有按照你想要的方式工作。

@depends只是查看具有所提供名称的测试是否已运行并获取结果。它甚至不知道也不关心所述测试的@annotations。

我猜想(没有深入研究 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) { ... }
Run Code Online (Sandbox Code Playgroud)

希望能帮助或至少激励其他人回答;)