如何模拟虚拟二进制文件,以便可以测试 exec() / system() / passthru() 函数输出?

Dod*_*uma 4 php phpunit unit-testing mocking

我有一个有趣的问题,并在互联网上搜索过,但还没有找到答案。

我在一家不允许员工使用 OOP 的公司工作,这有点荒谬,但工作经验很宝贵。

考虑以下函数:

function get_setting_values_from_file( $parameter )
{
    exec("/usr/var/binary --options $parameter", $output, $return);
    $settings = file( $output[0] );
    foreach( $settings as $setting ) {
        if( strstr( $setting, "color") ) {
            $setting = explode( ":", $setting );
            return $setting[1];
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我需要对类似的功能进行单元测试。我目前正在使用 phpUnit 进行测试,并使用 vfsStream 库来模拟文件系统,但是exec("/usr/var/binary --options $parameter", $output, $return)当我在无法访问实际系统的情况下进行开发时,如何模拟调用?处理此类测试用例的推荐方法是什么?

感谢所有反馈。

Mar*_*sch 6

您可以exec()使用函数模拟库进行模拟。我php-mock为你做了一个 ( ) ,它需要你使用命名空间

namespace foo;

use phpmock\phpunit\PHPMock;

class ExecTest extends \PHPUnit_Framework_TestCase
{

    use PHPMock;

    public function testExec()
    {
        $mock = $this->getFunctionMock(__NAMESPACE__, "exec");
        $mock->expects($this->once())->willReturnCallback(
            function ($command, &$output, &$return_var) {
                $this->assertEquals("foo", $command);
                $output = "failure";
                $return_var = 1;
            }
        );

        exec("foo", $output, $return_var);
        $this->assertEquals("failure", $output);
        $this->assertEquals(1, $return_var);
    }
}
Run Code Online (Sandbox Code Playgroud)