2013-05-01 4 views
0

Я изучаю модульное тестирование с помощью PHPUnit и запускаю странную проблему с макетными объектами, которые я не могу решить. Я создал эти фиктивные файлы в качестве примера того, что я испытываю:PHPUnit mock object methods

Class1

class PrimaryObj1 
{ 
    function doNothing(SecondObj $s) 
    { 
    } 
} 

Class2

class PrimaryObj2 
{ 
    function doNothing(SecondObj $s) 
    { 
     $s->TestMethod(); 
    } 
} 

и тестовый файл как:

class PrimaryObj1_test extends PHPUnit_Framework_TestCase 
{ 
    private $primaryObj; 
    function setUp() 
    { 
     $this->primaryObj = new PrimaryObj1(); 
    } 
    function testDoNothing() 
    { 
     $secondObj = $this->getMock('SecondObj'); 
     $secondObj->expects($this->once()) 
        ->method("TestMethod"); 
     $this->primaryObj->doNothing($secondObj); 
    } 
} 

(один тестовый файл для каждого фиктивного класса, где все одно и то же, за исключением имени класса).

Когда я бегу PHPUnit, это то, что я получаю:

Running Tests/PrimaryObj1_test.php 
1) PrimaryObj1_test::testDoNothing 
Expectation failed for method name is equal to <string:TestMethod> when invoked 1 time(s). 
Method was expected to be called 1 times, actually called 0 times. 

Running Tests/PrimaryObj2_test.php 
Fatal error: Call to undefined method Mock_SecondObj_99c898e7::TestMethod() in PrimaryObj2.php on line 5 

Итак, сначала он сошел с ума, что он не назвал ожидаемый метод, но тогда, когда я делаю это злится потому что это не определено. Я просто не могу победить. Я думаю, именно поэтому я все еще одинок ...

Любые мысли о том, почему это может происходить?

+0

Показать код 'SecondObj' – hek2mgl

+0

SecondObj существует только как макет. У него нет объявления кода или класса – baiano

+0

AFAIK должен быть издеваемым классом – hek2mgl

ответ

0

У меня есть ответ из списка рассылки, который служит с ответом. Эта линия:

$secondObj = $this->getMock('SecondObj'); 

должно быть:

$secondObj = $this->getMock('SecondObj', array('TestMethod')); 

После того, как я сделал это изменение он работал, как и ожидалось.