PHPUnit: saplama yöntemleri tanımlanmamış

1 Cevap php

Ben bir şey eksik olmalı. Ben PHPUnit bir sınıf üzerinde saplama yöntemleri çalışıyorum, ama ben alay nesnesinin yöntemini çağırdığınızda, bu yöntem undefined olduğunu söylüyor.

Saplama Örnek sınıfı:

namespace MyApp;

class MyStubClass 
{
   public function mrMethod()
   {
     // doing stuff
   }   
}

Bunu saplama, yazıyorum:

// specifying all getMock() args to disable calling of class __construct()
$stub = $this->getMock('MyStubClass', array(), array(), 'MockMyStubClass', false, false, false);
$stub->expects($this->any())
     ->method('mrMethod')
     ->will($this->returnValue('doing stuff'));

Ama söndürdü yöntemini çağırarak üzerine, bir istisna olsun:

$stub->mrMethod();
//PHP Fatal error:  Call to undefined method MockMyStubClass::mrMethod()

PHP 5.3.0 ile phpunit 3.4.3 kullanıyorum.

Fark başka küçük bir şey olduğunu, çünkü bir çift ad bir sınıf yükleme istisna getMock() yöntemi sonuçlarında bir ad belirterek eğer:

$stub = $this->getMock('MyApp\MyStubClass');
// Fatal error:  Class 'MyApp\MyApp\MyStubClass' not found

That strikes me as rather odd (and getmock() will not accept a namespace with a leading backslash). The only thing I could think to cause that would may be because this class is registered with an autoloader?

Herhangi bir düşünce?

1 Cevap

Kendi sorumu cevaplama:

Hayal kırıklığı biraz sonra, ben şeyler çalışma almak başarmıştı. Ben sorun oldu tam olarak emin değilim, ama başkalarına yardımcı olabilecek bir kaç şey keşfettiniz:

  • Emin (bu yazı yazılırken 3.4.6) PHPUnit en son sürümünü çalıştırıyorsanız olun
  • Tam-nitelenmiş ad eksi ilk ters eğik çizgi kullanın.

    $this->getMock('MyApp\Widgets\WidgetFactory');
    

Benim sorunun parçası PHPUnit bir saplama sınıf WidgetFactory aslında stubbing değildi MyApp\Widgets\WidgetFactory yaratıyor olmasıydı. Bir varolmayan bir sınıf saplama çalışıyor eğer bir durum ortaya olacağı beklenebilir, ancak bu isim karışıklığı ile gerçekleşmesi görünmüyor.

Ayrıca, here aşağıdaki gibi sınıf takma yöntemini kullanarak anlaşılacağı üzerine bir soru var:

    class_alias('MyApp\Widgets\WidgetFactory', 'WidgetFactory');
    $this->getMock('WidgetFactory');

Bu geçici benim sorunu çözmek mi, ben bunu şiddetle kullanmanızı tavsiye ediyorum. class_alias() setup() yöntem veya saplama nesil bir parçası olarak kullanıldığında ise apaçık bir sorunu neden olan bir durum, artırmadan aynı takma ad için iki kez aradı olamaz.