phpunit mock için yapıcı argümanlar önlemek

6 Cevap php

Bir davalarını nesne için kurucusunu çağırmak zorunda phpunit önlemek için yolu nedir? Aksi takdirde yapıcı bir argüman olarak bir davalarını nesnesi gerekir, o vb için başka bir API, bu gibi görünüyor:

getMock($className, $methods = array(), array $arguments = array(),
        $mockClassName = '', $callOriginalConstructor = TRUE,
        $callOriginalClone = TRUE, $callAutoload = TRUE)

Ben çalışmak için alamadım. Hala bile {[(0)] false} ayarlandığında, yapıcı tartışma hakkında şikayet.

Ben sadece yapıcı bir nesne var ve bu bir bağımlılık enjeksiyon. Yani orada bir tasarım sorunu var sanmıyorum.

6 Cevap

Sen getMockBuilder yerine kullanabilirsiniz sadece getMock:

$mock = $this->getMockBuilder('class_name')
    ->disableOriginalConstructor()
    ->getMock();

Ayrıntılar için PHPUnit's docs içinde Örnek 10.3 bakın.

Buyrun:

    // Get a Mock Soap Client object to work with.
    $classToMock = 'SoapClient';
    $methodsToMock = array('__getFunctions');
    $mockConstructorParams = array('fake wsdl url', array());
    $mockClassName = 'MyMockSoapClient';
    $callMockConstructor = false;
    $mockSoapClient = $this->getMock($classToMock,
                                     $methodsToMock,
                                     $mockConstructorParams,
                                     $mockClassName,
                                     $callMockConstructor);

Zeyilname olarak, expects() benim alay nesnesine çağırır ve sonra kurucusunu çağırmak takmak istedim. PHPUnit 3.7.14, aramak, döndürülen nesne disableOriginalConstructor() anlamıyla bir nesnedir.

// Use a trick to create a new object of a class
// without invoking its constructor.
$object = unserialize(
sprintf('O:%d:"%s":0:{}', strlen($className), $className)

Ne yazık ki, PHP 5.4 onlar kullanmadığınız yeni bir seçenek var:

ReflectionClass::newInstanceWithoutConstructor

Bu mevcut değildi çünkü, ben elle sınıfı yansıtacak ve daha sonra kurucu çağırmak zorunda kaldı.

$mock = $this->getMockBuilder('class_name')
    ->disableOriginalConstructor()
    ->getMock();

$mock->expect($this->once())
    ->method('functionCallFromConstructor')
    ->with($this->equalTo('someValue'));

$reflectedClass = new ReflectionClass('class_name');
$constructor = $reflectedClass->getConstructor();
$constructor->invoke($mock);

functionCallFromConstruct protected ise, özellikle setMethods() korunan yöntem alay böylece kullanmak zorunda, unutmayın. Örnek:

    $mock->setMethods(array('functionCallFromConstructor'));

setMethods() expect() çağrısından önce çağrılması gerekir. Şahsen ben getMock() disableOriginalConstructor() sonra ancak önce bu zinciri.

Çirkin biri vardır.

Daha önce tefrika nesne üzerinde unserialize() kullanın. PHP yerine __construct ve __wakeup arayacak.

Belki yapıcı argüman olarak geçirmek için bir saplama oluşturmanız gerekir. Sonra davalarını nesneleri bu zinciri kırabilir.

PHPUnit alay nesneler üzerinde kurucusunu çağırmak için tasarlanmıştır; Bunu önlemek için yapmanız gerekir ya:

  1. Eğer sorun yaşıyorsanız alay nesnesine bir bağımlılık olarak davalarını nesne enjekte
  2. Bunu aramak için çalışıyoruz sınıf ana kurucusunu çağırmak değil genişleten bir test sınıfı oluşturma