2011-06-10 87 views
0

我最近被赋予让我们的系统为单元测试设置的任务,但是我遇到了一个问题。 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 '*'; 
    } 
} 
?> 

回答

0

我真的不明白你在这里做什么,而是:

+0

调用'getMock()'将动态创建BarMock类以供稍后使用。我相信你指出的奇怪空白是它不起作用的原因(因为它几乎直接从博客文章中复制)。 – 2011-06-10 18:03:16

+0

对不起,我应该澄清。我曾尝试将getMock设置为某个变量,然后设置返回值。但PHPUnit似乎没有注意到我设置的变量和返回值。这是因为,我假设变量在任何地方都不会被使用。但是,如何设置代码,无法将模拟对象传递到foo,因此它知道使用该对象而不是实际的bar类。至于空白,这只是我写这个问题时的错误。 – forerr15 2011-06-10 18:46:06

+0

您是否可以更新您的问题以反映刚描述的代码? – 2011-06-10 18:56:50

1

的模拟类一些奇怪的空格不会公顷本身有任何预期的行为。要将它用作存根(在调用方法Y时执行X),您需要访问已创建的BarMock实例,但它看起来不像新的重载会给你那样。

相反,我会创建一个Bar的自定义子类,它返回你想要的doSomethingElse()