【问题标题】:PHPUnit How to get the REAL return value of mocked method?PHPUnit 如何获得模拟方法的真实返回值?
【发布时间】: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(); } }

我没有找到任何如何获得真正的返回值....令人沮丧:)

【问题讨论】:

  • 您模拟该方法以获得不变的测试结果,因此您可以使用不同的返回值测试您的代码行为。如果您只想使用方法返回的内容,请调用方法,而不是模拟。

标签: mocking phpunit stub


【解决方案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)
    猜你喜欢
    • 2016-03-21
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多