我一直在读普普尼特手册,其中有一部分,我只是看不出重点,与嘲笑的特点(figure 9.18)有关。
在他们的例子中,有一个具体的方法从一个抽象的方法(最终被测试模仿)返回值。
不幸的是,2句话的解释并不能解释为什么这是有用的!据我所见,测试显然会通过,但在现实世界中,抽象方法不会被嘲笑,它实际上会失败?
我们是否打算删除抽象方法,并在具体方法中替换对它的调用?如果是的话,测试的重点是什么?为什么我们要用抽象的方法来混淆那些没有实际使用的特征呢?
我的最终问题是,为什么写测试是为了通过测试,如果在现实世界中使用,它会失败?如果有人能帮助我理解它,那就太感谢了!
最佳答案
我稍微修改了链接后面的示例,以显示测试实际测试的内容:
<?php
trait AbstractTrait
{
public function concreteMethod()
{
// this is the only logic which is being tested in testConcreteMethod test
$result = $this->abstractMethod() * 2;
return $result;
}
/**
* @return int
*/
public abstract function abstractMethod();
}
class TraitClassTest extends PHPUnit_Framework_TestCase
{
public function testConcreteMethod()
{
$mock = $this->getMockForTrait('AbstractTrait');
$mock->expects($this->any())
->method('abstractMethod')
->will($this->returnValue(5));
$this->assertEquals(10, $mock->concreteMethod());
}
}
如果
AbstractTrait::concreteMethod
的实现发生变化,例如 public function concreteMethod()
{
$result = $this->abstractMethod() * 3;
return $result;
}
测试将失败。
老实说,我从来没有在现实生活中用抽象的方法来使用trait,而是通过测试使用trait的类之一来测试trait的逻辑。在上面的例子中,如果不模拟抽象方法,就不可能单独测试
AbstractTrait::concreteMethod
。关于php - PHPUnit模拟特征,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33776294/