PHPUnit 如何获得模拟方法的真实返回值?
Posted
技术标签:
【中文标题】PHPUnit 如何获得模拟方法的真实返回值?【英文标题】:PHPUnit How to get the REAL return value of mocked method? 【发布时间】:2015-01-02 20:09:58 【问题描述】:如何获得模拟类/方法的真实返回值?我发现了很多返回固定值的可能性,但我想要我调用的模拟方法的结果
命名空间更新器\模型; 类测试类 公共函数 testFunction() 返回 12345; 类 DatabaseTest 扩展 phpUnit_Framework_TestCase 公共函数 testMock() $mock = $this->getMock('Updater\Model\TestClass', array('testFunction')); $mock->expects($this->once())->method('testFunction') // 调用函数....这里我想得到值 12345 $result = $mock->testFunction();我没有找到任何如何获得真正的返回值....令人沮丧:)
【问题讨论】:
您模拟该方法以获得不变的测试结果,因此您可以使用不同的返回值测试您的代码行为。如果您只想使用方法返回的内容,请调用方法,而不是模拟。 【参考方案1】:AFAIK 你不能用 PHPUnit 本机模拟来做到这一点。有一个名为 Mockery 的模拟库可以做到这一点:
http://docs.mockery.io/en/latest/reference/expectations.html
寻找passthru()
方法。
也就是说,您需要从模拟中调用真实方法并不常见。你能解释一个真实的案例吗?您可以模拟方法,以便控制它们的行为(返回值、抛出异常等)。
【讨论】:
【参考方案2】:您可以在 PHPunit 中完成。这是我的例子。查看getMock
方法,您必须在其中指定要模拟的方法。
<?php
namespace Acme\DemoBundle\Tests;
class TestClass
public function testFunction()
return 12345;
public function iWantToMockThis()
return 'mockME!';
class DatabaseTest extends \PHPUnit_Framework_TestCase
public function testMock()
$mock = $this->getMock('Acme\DemoBundle\Tests\TestClass', array('iWantToMockThis'));
$mock->expects($this->once())
->method('iWantToMockThis')
->willReturn("Mocked!");
// The Real value
$this->assertEquals(12345,$mock->testFunction());
// The mocked value
$this->assertEquals("Mocked!",$mock->iWantToMockThis());
希望对您有所帮助。
【讨论】:
他想从被模拟的方法中得到真正的价值 @gontrollez 如果模拟该方法,他可以在各种测试场景中使用。感谢您的回复,我看到了嘲笑,我很欣赏嘲笑库,我希望尽快使用它!!!! (并为您 +1)以上是关于PHPUnit 如何获得模拟方法的真实返回值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用PHPUnit测试一个方法调用了同一个类的其他方法,但是没有返回值
如何让 PHPUnit MockObjects 根据参数返回不同的值?