【问题标题】:Is it possible to use mocking on a procedural (non-oo) function? [duplicate]是否可以在程序(非 oo)函数上使用模拟? [复制]
【发布时间】:2012-10-24 13:27:35
【问题描述】:

可能重复:
PHP - override existing function

我想使用模拟对我的一些具有外部依赖项的函数进行单元测试。

所以这里...下面是我正在使用的简化模型。我继承的很多代码都是这样写的,所以我希望能够写一些简单的测试,如果可能的话不必重写:

function display_tasks($id)
{
    $tasks = call_some_function_that_runs_a_database_query($id);

    $html = "<some html>";

    foreach ($tasks as $task)
    {
        // Some operations here
    }

    $html .= "</some html>";

    return $html;
}

我的函数调用的代码没有封装在对象中,因此我无法将各种示例付诸实践,因为互联网上 99% 的示例都是基于面向对象的代码。甚至可以直接从 PHPunit 模拟过程函数吗?

我希望能够模拟 call_some_function_that_runs_a_database_query 返回的任何内容。我尝试过使用内置的 PHPunit 模拟方法,但这样做不会覆盖我函数中原始调用的结果。

任何帮助或示例将不胜感激。

【问题讨论】:

    标签: php unit-testing mocking phpunit


    【解决方案1】:

    您可以使用runkit PHP extension 将一个函数替换为在测试期间返回您想要的函数的函数。它比模拟对象更麻烦,因为在所有情况下(通过、失败、错误)测试后,您都必须注意将原始对象换回。

    被测函数

    function getTasksFromDatabase($id) {
        // call to database...
    }
    

    测试用例

    function stub_getTasksFromDatabase($id) {
        return array('one', 'two', 'three');
    }
    
    class getUserTest extends PHPUnit_Framework_TestCase {
        public static function setUpBeforeClass() {
            runkit_function_rename('getTasksFromDatabase', 'orig_getTasksFromDatabase');
            runkit_function_rename('stub_getTasksFromDatabase', 'getTasksFromDatabase');
        }
    
        public function tearDownAfterClass() {
            runkit_function_rename('getTasksFromDatabase', 'stub_getTasksFromDatabase');
            runkit_function_rename('orig_getTasksFromDatabase', 'getTasksFromDatabase');
        }
    
        public function setUp() {
            $html = getTasks(1);
            self::assertEquals('<some html>...one...two...three...</some html>', $html);
        }
    }
    

    【讨论】:

    • 谢谢大卫。实际上我昨晚深夜遇到了这个解决方案,但我没有安装 runkit,而是安装了 php 测试助手(也是由伟大的 Sebastian Bergmann 编写的)。详情在这里:github.com/sebastianbergmann/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多