PHPUnit 模拟特征
PHPUnit mocking traits
我一直在阅读 PHPUnit 手册,其中有一部分与 mocking traits (figure 9.18) 有关,我只是看不出其中的意义 (figure 9.18)。
在他们的示例中,有一个具体方法 returns 来自抽象方法的值(最终被测试模拟)。
不幸的是,两句话的解释没有解释为什么这有用!据我所知,测试显然会通过,但在现实世界中,抽象方法不会被模拟,它实际上会失败?
我们是否打算删除抽象方法并在具体方法中替换对它的调用?如果是这样,测试的重点是什么?为什么我们用实际上没有使用的抽象方法来混淆特征?
我的最终问题是,为什么编写的测试在测试中通过,如果在现实世界中使用,它会失败?如果有人能帮我理解一下,将不胜感激!
我稍微修改了 link 后面的示例以揭示测试实际测试的内容:
<?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;
}
测试将失败。
老实说,我从未在现实生活中使用具有抽象方法的特征,并通过测试使用该特征的 类 之一来测试特征的逻辑。如上例所示,如果不模拟抽象方法,就不可能单独测试 AbstractTrait::concreteMethod
。
我一直在阅读 PHPUnit 手册,其中有一部分与 mocking traits (figure 9.18) 有关,我只是看不出其中的意义 (figure 9.18)。
在他们的示例中,有一个具体方法 returns 来自抽象方法的值(最终被测试模拟)。
不幸的是,两句话的解释没有解释为什么这有用!据我所知,测试显然会通过,但在现实世界中,抽象方法不会被模拟,它实际上会失败?
我们是否打算删除抽象方法并在具体方法中替换对它的调用?如果是这样,测试的重点是什么?为什么我们用实际上没有使用的抽象方法来混淆特征?
我的最终问题是,为什么编写的测试在测试中通过,如果在现实世界中使用,它会失败?如果有人能帮我理解一下,将不胜感激!
我稍微修改了 link 后面的示例以揭示测试实际测试的内容:
<?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;
}
测试将失败。
老实说,我从未在现实生活中使用具有抽象方法的特征,并通过测试使用该特征的 类 之一来测试特征的逻辑。如上例所示,如果不模拟抽象方法,就不可能单独测试 AbstractTrait::concreteMethod
。