phpunit-模拟构建器-设置模拟对象内部属性 [英] phpunit - mockbuilder - set mock object internal property

查看:56
本文介绍了phpunit-模拟构建器-设置模拟对象内部属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以使用禁用的构造函数并手动设置受保护的属性来创建模拟对象?

Is it possible to create a mock object with disabled constructor and manually setted protected properties?

这是一个愚蠢的例子:

class A {
    protected $p;
    public function __construct(){
        $this->p = 1;
    }

    public function blah(){
        if ($this->p == 2)
            throw Exception();
    }
}

class ATest extend bla_TestCase {
    /** 
        @expectedException Exception
    */
    public function testBlahShouldThrowExceptionBy2PValue(){
        $mockA = $this->getMockBuilder('A')
            ->disableOriginalConstructor()
            ->getMock();
        $mockA->p=2; //this won't work because p is protected, how to inject the p value?
        $mockA->blah();
    }
}

所以我想注入受保护的p值,所以我不能.我应该定义setter或IoC,还是可以用phpunit做到这一点?

So I wanna inject the p value which is protected, so I can't. Should I define setter or IoC, or I can do this with phpunit?

推荐答案

您可以使用Reflection将该属性公开,然后设置所需的值:

You can make the property public by using Reflection, and then set the desired value:

$a = new A;
$reflection = new ReflectionClass($a);
$reflection_property = $reflection->getProperty('p');
$reflection_property->setAccessible(true);

$reflection_property->setValue($a, 2);

无论如何,在您的示例中,您都不需要为引发异常设置p值.您正在使用模拟程序来控制对象的行为,而无需考虑其内部.

Anyway in your example you don't need to set p value for the Exception to be raised. You are using a mock for being able to take control over the object behaviour, without taking into account it's internals.

因此,不是将p = 2设置为引发异常,而是将模拟配置为在调用blah方法时引发异常:

So, instead of setting p = 2 so an Exception is raised, you configure the mock to raise an Exception when the blah method is called:

$mockA = $this->getMockBuilder('A')
        ->disableOriginalConstructor()
        ->getMock();
$mockA->expects($this->any())
         ->method('blah')
         ->will($this->throwException(new Exception));

最后,您在ATest中嘲笑A类很奇怪.通常,您可以模拟要测试的对象所需的依赖关系.

Last, it's strange that you're mocking the A class in the ATest. You usually mock the dependencies needed by the object you're testing.

希望这会有所帮助.

这篇关于phpunit-模拟构建器-设置模拟对象内部属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆