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:使用Mock修改返回值?

如何让 PHPUnit MockObjects 根据参数返回不同的值?

PHPUnit Mock稍后改变期望

用模拟函数替换真实返回值和函数实现的 Pythonic 方式

初识 PHPunit stub 模拟返回数据