【问题标题】:PHPUnit: Mock a method to behave like identityPHPUnit:模拟一种表现得像身份的方法
【发布时间】:2015-11-26 07:40:05
【问题描述】:

使用 PHPUnit,有什么方法可以模拟一个方法并使其 表现得像身份 (x->x) ?大概是这样的:

$this->myMethod(Argument::any())->willReturn(<should return the argument untouched>)

【问题讨论】:

    标签: php unit-testing testing phpunit


    【解决方案1】:

    您可以使用returnArgument() 方法。来自文档:

    有时您想返回方法调用的参数之一 (未更改)作为存根方法调用的结果。例 9.4 显示 如何使用 returnArgument() 而不是 returnValue().

    例如:

    class StubTest extends PHPUnit_Framework_TestCase
    {
        public function testReturnArgumentStub()
        {
            // Create a stub for the SomeClass class.
            $stub = $this->getMockBuilder('SomeClass')
                         ->getMock();
    
            // Configure the stub.
            $stub->method('doSomething')
                 ->will($this->returnArgument(0));
    
            // $stub->doSomething('foo') returns 'foo'
            $this->assertEquals('foo', $stub->doSomething('foo'));
    
            // $stub->doSomething('bar') returns 'bar'
            $this->assertEquals('bar', $stub->doSomething('bar'));
        }
    }
    

    【讨论】:

    • 谢谢。我已经尝试过了,但似乎返回的参数不是同一个对象类,而是 PHPUnit_Framework_MockObject_Stub_ReturnArgument 类。所以我不能在返回的对象上调用任何方法。有什么想法吗?
    • 嗨@MarcPe-Pe 你能提供一些你的测试代码吗?一个最小的场景表示赞赏
    • 感谢您的帮助@Matteo。我通过创建一个更易于测试的子服务来重构我的服务。我想面对我遇到的那种问题可以在一个人的代码中概述一个设计问题。我会将您的答案标记为已接受,因为这也是我最接近回答该特定问题的答案。
    • 嗨@MarcPe-Pe,不客气!我同意你关于测试实践可以帮助改进设计的观点!
    猜你喜欢
    • 2011-10-28
    • 2020-05-13
    • 2010-12-11
    • 2013-01-27
    • 1970-01-01
    • 2018-05-26
    • 2019-07-29
    • 2021-06-16
    • 2016-06-13
    相关资源
    最近更新 更多