Próbuję sprawdzić, czy metoda chroniona jest wywoływana w interfejsie publicznym.Testowanie, czy chroniona metoda została nazwana
<?php
abstract class SomeClassAbstract
{
abstract public foo();
public function doStuff()
{
$this->_protectedMethod();
}
protected function _protectedMethod();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('SomeClass');
$mock->expects($this->once())
->method('_protectedMethod');
$mock->doStuff();
}
}
wiem, że nazywa się poprawnie, ale PHPUnit mówi jej nie nazwał.
To samo dzieje się, kiedy przetestować inny sposób, gdy metoda jest nigdy nazywa:
<?php
abstract class AnotherClassAbstract
{
abstract public foo();
public function doAnotherStuff()
{
$this->_loadCache();
}
protected function _loadCache();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('AnotherClass');
$mock->expects($this->once())
->method('_loadCache');
$mock->doAnotherStuff();
}
}
Metoda nazywa ale PHPUnit mówi, że tak nie jest.
Co robię źle?
Edit nie byłem deklarując moje metody z podwójnym dwukropkiem, to było po prostu za oznaczający, że była to metoda publicznego (interfejs). Zaktualizowano do pełnych deklaracji klasy/metod.
Edycja 2 powinienem powiedzieć, że jestem testowania niektóre implementacje metod w abstrakcyjne klasy (edytowany kod zastanowienia się tego). Ponieważ nie mogę utworzyć instancji klasy, jak mogę to przetestować?
Zastanawiam się nad stworzeniem SomeClassSimple
przedłużania SomeClassAbstract
i testowanie tego zamiast. Czy to właściwe podejście?
dziękuję Ewan, Masz rację.Oczywiście, jeśli jest to fałszywy obiekt, nie ma implementacji metody. Jak głupi jestem. Zaznaczę twoją odpowiedź jako poprawną. Jeśli możesz, proszę, zobacz moją drugą edycję. –
To, co próbuję przetestować, to implementacja, a nie zachowanie, prawda? To dla mnie trochę bardziej oczywiste, dziękuję. –
Testowanie jednostek jest, jak sądzę, bardziej sztuką niż się wydaje. Doceniam to jeszcze bardziej po przeczytaniu wzorów testowych xUnit: Kod testowy refaktoryzacji Gerarda Meszarosa. Z kolei książka była silną rekomendacją Sebastiana Bergmanna, autora PHPUnit. –