php - 创建具有默认属性的模拟对象

标签 php phpunit

我需要创建一个具有默认属性集的模拟对象,以便在实例化时可以在代码库中使用其他软件。

$mock = $this->getMock('MyClass', array(), array(), 'MyClass_Mock');
$mock->prop = 'foobar';

$myclassMock = new get_class($mock);
var_dump($myclassMock->prop); // NULL
// How can I make this dump 'foobar' ?

我正在测试确定、定位和实例化这些类的框架的一部分,因此注入(inject)模拟对象会破坏测试的目的。

我不需要模拟任何方法.. 只需像这样动态创建一个模拟类:

class MyClass_Mock extends MyClass {
  public $prop = 'foobar';
}

编辑:简化示例

最佳答案

您对使用 Reflection 感觉如何?

$r = new ReflectionClass('MyClass');

$props = $r->getDefaultProperties();

$mock = new stdClass;

foreach ($props as $prop => $value) {
    $mock->$prop = $value;
}

我自己并没有经常使用 Reflection,仅用于基本的内省(introspection)。我不确定您是否能够使用它完全模仿可见性等,但如果您继续沿着写入字符串和 evaling 的路线前进,我不明白为什么不这样做。

编辑:

出于好奇扫描了反射函数,如果您在字符串和 中动态构建类,则完全有可能使用虚拟方法完全模仿类,在适当的地方实现完整的可见性约束、常量和静态元素评估它。

然而,当涉及到正确获取数据类型时,它看起来将是一个完整的任务,以真正完全支持每一种可能性(您需要代码来重建例如,来自数组的数组构造函数)

如果你沿着这条路走下去,祝你好运,它需要比我现在愿意节省的更多的脑力:)

这里有一些代码,您可以用常量做同样的事情,并以类似的方式创建空方法。

class Test
{
    private static $privates = 'priv';
    protected $protected = 'prot';
    public $public = 'pub';
}

$r = new ReflectionClass('Test');

$props = $r->getDefaultProperties();

$mock = 'class MockTest {';

foreach ($props as $prop => $value) {
    $rProp = $r->getProperty($prop);


    if ($rProp->isPrivate()) {
        $mock .= 'private ';
    }
    elseif ($rProp->isProtected()) {
        $mock .= 'protected ';
    }
    elseif ($rProp->isPublic()) {
        $mock .= 'public ';
    }

    if ($rProp->isStatic()) {
        $mock .= 'static ';
    }

    $mock .= "$$prop = ";

    switch (gettype($value)) {
        case "boolean":
        case "integer":
        case "double":
            $mock .= $value;
            break;
        case "string":
            $mock .= "'$value'";
            break;
/*
"array"
"object"
"resource"
*/
    case "NULL":
            $mock .= 'null';
            break;
    }

    $mock .= ';';
}

$mock .= '}';

eval($mock);

var_dump(new MockTest);

关于php - 创建具有默认属性的模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330863/

相关文章:

php - TravisCI PHPUnit fatal error - 调用未定义的方法 PHPUnit_Util_Configuration::getTestdoxGroupConfiguration()

javascript - 通过POST请求上传大型base64图像时丢失信息

php - 需要增加特定目录而不是整个服务器的PHP内存限制

php - SSL 错误 : Secure Connection Failed

unit-testing - PhpStorm 中的 PHPUnit Bootstrap

phpunit - 如何从phpunit覆盖率报告中排除目录

php - 使用 LOAD DATA LOCAL INFILE 的 Symfony2 Doctrine PDO MySQL 连接

javascript - 卡住 jquery 加载上最后查看的位置

phpunit : how to get the count of tests in a test directory without running test

php - 使用 Laravel Scout 索引的模型测试失败