Kiedy testuję swój kod php za pomocą PHPUnit, próbuję znaleźć właściwy sposób na wyśmiewanie obiektu bez drwi z żadnej z jego metod.Tworzenie makiety w phpunit bez kpienia z jakichkolwiek metod?
Problem polega na tym, że jeśli nie zadzwonię pod numer getMockBuilder()->setMethods()
, wszystkie metody na obiekcie będą wyśmiewane i nie będę mógł wywołać metody, którą chcę przetestować; ale jeśli mam do zadzwonić pod numer setMethods()
, to muszę powiedzieć, jaką metodę naśmiewać, ale nie chcę drwić żadnych metod w ogóle. Ale muszę stworzyć próbę, aby uniknąć wywoływania konstruktora w moim teście.
Oto trywialny przykład metody chciałbym do badania:
class Foobar
{
public function __construct()
{
// stuff happens here ...
}
public function myMethod($s)
{
// I want to test this
return (strlen($s) > 3);
}
}
mogę przetestować myMethod()
z:
$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
Ale to nazwałbym konstruktora foobar, w których nie chcieć. Zamiast więc będę próbować:
$obj = $this->getMockBuilder('Foobar')->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Ale nazywając getMockBuilder()
bez użycia setMethods()
spowoduje wszystkich jego metod jest wyśmiewany i wraca pusty, więc moje wezwanie do myMethod()
zwróci NULL bez dotykania kodu zamierzam przetestować.
Moja obejście dotąd to:
$obj = $this->getMockBuilder('Foobar')->setMethods(array('none'))
->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
To będzie kpić metodę o nazwie „none”, która już nie istnieje, ale PHPUnit nie obchodzi. Zostawię on myMethod() niezmieniony, tak żebym mógł go nazwać, a także pozwoli mi wyłączyć konstruktora, tak że go nie nazywam. Idealny! Tyle tylko, że wydaje się, że trzeba oszukiwać, aby podać nazwę metody, która nie istnieje - "none", "blargh" lub "xyzzy".
Jaki byłby właściwy sposób robienia tego?
Dziękuję bardzo! Wygląda na to, że setMethods (null) jest tym, czego chcę; to nie powoduje wyśmiewania się z metod. Z drugiej strony setMethods (array()) wydaje się powodować, że wszystkie metody są wyśmiewane, tak samo jak nie używanie w ogóle metody setMethods(). Nie mogłem znaleźć tego udokumentowanego nigdzie. Co masz na myśli przez "pustych rodziców"? –
Ponadto - jestem zaintrygowany twoim komentarzem. Pomijając specyfikę trywialnego przykładu myMethod() podanego powyżej, dlaczego metoda, która musi zostać przetestowana w ten sposób, powoduje, że czujesz, że metoda powinna zostać przeniesiona do innej klasy lub wykonana statycznie? –
@BrianKendig - Autokorekta kończy się niepowodzeniem na "rodzicach", które powinny być "parens". :) Właśnie sprawdziłem źródło i nie ma wartości domyślnej, więc sam musisz przekazać 'null'. –