PHP修改私有属性没有修饰符
#tdd #php #symfony #think

apresentaã§o

个人说话好吧!本文的想法正在帮助您为公司内的测试做出更多贡献

让我们转到以下假设,想象一下您将测试您以测试一个肿胀的课程和高度耦合,当然,此课程没有建筑商收到的属性,您是您的

>

类示例:

<?php

use ...
class SomeClass
{
    private AnotherClass $anotherClass;

    public function __construct()
    {
        $this->anotherClass = new AnotherClass();
        //... another calls classes

    }

    public function someMethod(Type $args): SomeType
    {
        //... any business logic 
        $this->anotherClass->doIt();

        return $someType;
    }
}

想对我来说,将有一个很高的耦合,如果您接受该类是由您的构建器中的部分发送的,则可能是与可能使用的其他类别的兼容性。

想象,anotherClass::doIt是有风险的,如果被称为严重的后果,例如,质量更新以解决此问题,您可以在测试中覆盖此属性:


<?php

class SomeTest extends TestCase
{
    public function testAnywere(): void
    {
        $anotherClassMock = $this->getMockBuilder(AnotherClass::class)
            ->disableOriginalConstructor()
            ->getMock();
        $anotherClassMock
            ->method('doIt');

        $someClass = new SomeClass();
        $setSomeClassClosure = function ()  use ($anotherClassMock){
            $this->anotherClass = $anotherClassMock;
        };
        $doSetSomeClassClosure = $setSomeClassClosure
            ->bindTo($someClass, SomeClass::class);
        $doSetSomeClassClosure();

    }
}

注意:这种测试方式的想法使您有能力解决某些遗产和风险,总体而言,理想是重写此母亲