我最近被赋予让我们的系统为单元测试设置的任务,但是我遇到了一个问题。 http://sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html的示例设置与我试图测试的代码非常相似。我唯一需要做的其他事情是让doSomethingElse()
返回我选择的东西。如何在PHPUnit中使用test_helpers扩展时设置返回值
UPDATE
我曾尝试getMock
设置一些变量,然后设置返回值。但PHPUnit似乎没有注意到我设置的变量和返回值。这是因为我假设变量从未在任何地方使用过。但是如何设置代码,无法将模拟对象传递到foo,因此它知道使用该对象而不是实际的Bar类。我已经在Foo和Bar类中添加了以便于参考。原始的Bar类返回*,但我希望它从模拟类返回**。
使用set_new_overload()
对此测试不是强制性的,但到目前为止使用它是我成功模拟Bar的唯一方法。
<?php
require_once 'Foo.php';
class FooTest extends PHPUnit_Framework_TestCase {
protected function setUp()
{
$mock = $this->getMock(
'Bar', /* name of class to mock */
array('doSomethingElse'), /* list of methods to mock */
array(), /* constructor arguments */
'BarMock' /* name for mocked class */
);
$mock->expects($this->any())
->method("doSomthingElse")
->will($this->returnValue("**")
);
set_new_overload(array($this, 'newCallback'));
}
protected function tearDown()
{
unset_new_overload();
}
protected function newCallback($className)
{
switch ($className) {
case 'Bar':
return 'BarMock';
default:
return $className;
}
}
public function testDoSomething()
{
$foo = new Foo;
$this->assertTrue($foo->doSomething());
}
}
?>
<?php
require_once 'Bar.php';
class Foo {
public function doSomething()
{
// ...
$bar = new Bar;
$bar->doSomethingElse();
// ...
return TRUE;
}
}
?>
<?php
class Bar {
public function doSomethingElse()
{
return '*';
}
}
?>
调用'getMock()'将动态创建BarMock类以供稍后使用。我相信你指出的奇怪空白是它不起作用的原因(因为它几乎直接从博客文章中复制)。 – 2011-06-10 18:03:16
对不起,我应该澄清。我曾尝试将getMock设置为某个变量,然后设置返回值。但PHPUnit似乎没有注意到我设置的变量和返回值。这是因为,我假设变量在任何地方都不会被使用。但是,如何设置代码,无法将模拟对象传递到foo,因此它知道使用该对象而不是实际的bar类。至于空白,这只是我写这个问题时的错误。 – forerr15 2011-06-10 18:46:06
您是否可以更新您的问题以反映刚描述的代码? – 2011-06-10 18:56:50