2015-09-21 1 views
1

Я пытаюсь выполнить модульный тест класса, где один общедоступный метод (метод 1) использует другой открытый метод (метод 2) того же класса внутри него. Например.Мощный публичный метод тестируемого класса

class MyClass { 
    public function method1() 
    { 
     $var = $this->method2(); 
     // Do stuff with var to get $answer 
     return $answer; 
    } 

    public function method2() 
    { 
     // Do complex workings out to get $var 
     return $var; 
    } 
} 

Теперь method2 уже протестированы, и я не хочу, чтобы создать аргумент для того, чтобы на самом деле назвать это в то время тестирования method1. Я просто хочу макет method2 и определить в своем тесте, что будет возвращено. Это то, что у меня есть:

function test_method1() 
{ 
    $myClass = new MyClass(); 

    $mockedMyClass = Mockery::mock('MyClass'); 
    $mockedMyClass->shouldReceive('method2')->once()->andReturn([1,2,3,4]); // mocked $var returned to be used in the rest of method1 

    $answer = $myClass->method1(); 
    // Assertions 
} 

Очевидно, что это не работает, как метод испытывается в том же классе, содержит метод дразнят, так что нет никакого способа, чтобы пройти в издевался классе как зависимость. Каков наилучший способ издеваться над методом method2?

+0

Всякий раз, когда вы чувствуете потребность высмеивать метод класса, который вы тестируете , это показатель того, что класс должен быть разделен на две части и проверен индивидуально. Потому что, если вы чувствуете потребность насмехаться, потому что «я не хочу создавать аргумент», класс, вероятно, слишком много. – Sven

ответ

1

Функциональность тестового фреймворка Partial Mock, позволяющая тестировать тот же класс, который вы помечены как посмеянный. В качестве примера, предположим, что измененный класс:

<?php 


namespace Acme\DemoBundle\Model; 


class MyClass { 
    public function method1() 
    { 
     $var = $this->method2(); 
     $answer = in_array(3, $var); 
     // Do stuff with var to get $answer 
     return $answer; 
    } 

    public function method2() 
    { 
     // Do complex workings out to get $var 
     return array(); 
    } 
} 

и испытаны следующим образом:

<?php 
namespace Acme\DemoBundle\Tests; 


class MyClassTest extends \PHPUnit_Framework_TestCase { 

    function test_method1() 
    { 

     $mockedMyClass = \Mockery::mock('Acme\DemoBundle\Model\MyClass[method2]'); 
     $mockedMyClass->shouldReceive('method2')->once()->andReturn([1,2,3,4]); // mocked $var returned to be used in the rest of method1 

     $answer = $mockedMyClass->method1(); 
     $this->assertTrue($answer);  // Assertions 
    } 

} 

Надежда эта помощь

+0

Это делает - спасибо – harryg

Смежные вопросы