【问题标题】:PHPUnit - Stub acting like a build in typePHPUnit - 存根就像一个内置类型
【发布时间】:2011-11-10 18:03:43
【问题描述】:

例如,如何使我的存根像 ArrayIterator 一样工作?我的意思是,我想迭代这个存根。这是 Practical PHP Testing 中的一个练习。

7.2
Write a EvenIterator which takes a FibonacciIterator an iterates only
on the even-indexed values (returning 0, 1, 3, 8, 21...).
7.3
Write tests for the EvenIterator class, stubbing out the
FibonacciIterator using an ArrayIterator in substitution, which is provided
by the Spl (otherwise it will never terminate!)

谢谢。

【问题讨论】:

  • 对 FibonacciIterator 的正常调用是什么样的?
  • 它实现了一个迭代器。你调用 $a = new FibonacciIterator(7)。之后您可以迭代 0、1、1、2、3、5、8。谢谢。
  • 该任务实际上不是说“使用 ArrayIterator 作为 FibonacciIterator 的存根”吗?
  • 在测试前教写代码的指南是什么样的?!

标签: php unit-testing mocking phpunit stub


【解决方案1】:

如果我理解正确,这里的任务是使用ArrayIterator 作为FibonacciIterator 的存根来测试EvenIterator。 因此,例如使用偶数数组加载ArrayIterator,将其传递给EvenIterator,您应该得到相同的值。然后对奇数数组做同样的事情,你应该得到空结果集。


class EvenIteratorTest extends \PHPUnit_Framework_TestCase {

  public function testDoesNotRemoveEvens() {

    $data = array(2,4,6,8);
    $arrayIterator = new \ArrayIterator($data);
    $object = new EvenIterator($arrayIterator);

    $expected = $data;
    $actual = array();
    foreach($object as $v) {
      $actual[] = $v;
    }
    $this->assertEquals($expected,$actual);
  }

  public function testFiltersOutOdds() {

    $data = array(1,3,5,7);
    $arrayIterator = new \ArrayIterator($data);
    $object = new EvenIterator($arrayIterator);

    $actual = array();
    foreach($object as $v) {
      $actual[] = $v;
    }
    $this->assertEmpty($actual);
  }

}

如您所见,有很多重复的代码,因此需要进行一些重构。

【讨论】:

  • 你可以用代码来解释你说的话吗?非常感谢 Mchl。
  • 当然。它非常简化(因此有点难看),因为我不知道你的实现细节,或者你使用的测试框架。
  • 也许使用iterator_to_array 而不是foreach?但是我 +1 :)
  • foreach 对我来说似乎更自然,但实际上 _to_array 在这里可能看起来更好
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 2011-12-15
  • 2017-02-04
  • 1970-01-01
  • 2012-01-22
  • 2015-08-26
  • 2011-12-26
相关资源
最近更新 更多