使用PHPUnit和模拟对象,我正在尝试测试一些使用
这是要测试的类:
每次调用时,_ac231064后缀都会发生改变。
这导致我的测试失败了,那么我有哪些选择?
1. 重新设计代码以避免使用get_class?这意味着在编写可测试代码时不应使用get_class。 2. 使用ContainerBlock类的真实实例而不是模拟对象?这意味着我们实际上同时测试了两个类。 3. 您们将要建议的其他超级聪明的技巧? ;)
感谢您的任何帮助...
get_class
来确定对象是否被过滤器包含的代码。这是要测试的类:
class BlockFilter implements FilterInterface
{
private $classes;
public function __construct(array $classes = array())
{
$this->classes = $classes;
}
public function isIncluded(NodeTraversableInterface $node)
{
if (Type::BLOCK != $node->getDocumentType()) {
return false;
}
if (! empty($this->classes)) {
/*** HERE IS THE PROBLEM: ***/
return in_array(get_class($node), $this->classes);
}
return true;
}
}
这是我的单元测试中的方法:
public function testIfContainerBlockIsIncluded()
{
$containerBlock = $this->getMock('Pwn\ContentBundle\Document\ContainerBlock');
$containerBlock->expects($this->any())->method('getDocumentType')->will($this->returnValue(Type::BLOCK));
$filter = new BlockFilter(array('Pwn\ContentBundle\Document\ContainerBlock'));
$this->assertTrue($filter->isIncluded($containerBlock));
}
模拟对象$containerBlock
的行为类似于真实对象Pwn\ContentBundle\Document\ContainerBlock
;即使使用instanceof
也可以正常工作(我认为这是因为PHPUnit将其作为真实类的子类)。
正在测试的代码使用get_class
获取类的字符串值,并将其与预期类名数组进行比较。不幸的是,对于模拟对象,get_class
返回的是这样的结果:
Mock_ContainerBlock_ac231064
每次调用时,_ac231064后缀都会发生改变。
这导致我的测试失败了,那么我有哪些选择?
1. 重新设计代码以避免使用get_class?这意味着在编写可测试代码时不应使用get_class。 2. 使用ContainerBlock类的真实实例而不是模拟对象?这意味着我们实际上同时测试了两个类。 3. 您们将要建议的其他超级聪明的技巧? ;)
感谢您的任何帮助...