如何在phpunit中模拟git diff的结果

如何在phpunit中模拟git diff的结果,php,git,phpunit,shell-exec,git-diff,Php,Git,Phpunit,Shell Exec,Git Diff,我正在用PHP编写一个数据库迁移脚本,需要在phpunit中模拟git差异的结果。 其思想是git diff只返回自上次提交以来在includes/中添加或更新的文件名。当然,随着我编写脚本并提交更改,这一点会不断改变 下面是Migrate类和gitDiff方法: #!/usr/bin/php <?php class Migrate { public function gitDiff(){ return shell_exec('git diff HEAD^ HE

我正在用PHP编写一个数据库迁移脚本,需要在phpunit中模拟git差异的结果。 其思想是git diff只返回自上次提交以来在includes/中添加或更新的文件名。当然,随着我编写脚本并提交更改,这一点会不断改变

下面是Migrate类和gitDiff方法:

#!/usr/bin/php
<?php

class Migrate {

    public function gitDiff(){
        return shell_exec('git diff HEAD^ HEAD --name-only includes/');
    }
}
?>
#/usr/bin/php
有什么想法吗

在PHPUnit中:

$mock = $this->getMockBuilder('Migrate')
                     ->setMethods(array('getDiff'))
                     ->getMock();

$mock->expects($this->any())
        ->method('getDiff')
        ->will($this->returnValue('your return'));

$this->assertEquals("your return", $mock->getDiff());
您可以使用模拟工具:

$mock = Mock::create('Migrate');

Mock::when($mock)->getDiff()->thenReturn('your return');

$this->assertEquals("your return", $mock->getDiff());

所有文档。

您有什么问题/您具体询问了什么?如何创建模拟?如何获得假差异结果?还有别的吗?就像你模仿其他php函数一样。如果您的答案是如何在模拟时生成命令输出,请将实际执行结果存储在文件中,并使模拟返回这些文件内容。@PeeHaa理想情况下,我要做的是测试命令是否按预期执行。我只是有点不确定该怎么办。您可以编写一个集成测试,在/tmp中创建一个新的git存储库,然后提交一些内容,调用您的方法并检查结果是否正常。您必须更改您的Migrate::gitDiff,以使repo path可配置或作为参数提供(返回shell_exec(“cd$repo_path;git diff HEAD^HEAD”)),但这需要大量的工作,您不需要真正测试git是否工作:P所以我将使用gontrollez解决方案。感谢您花时间回答,我将签出这个库,我相信它在未来会派上用场,尽管我已经意识到模仿可能不是最好的选择。但这仍然是对我的起源问题的一个很好的回答。