2013-03-20 3 views
0

У меня возникла проблема с классом, который возвращает непредсказуемые значения и модульное тестирование метода, который вызывает эти функции. Поэтому я собираюсь изменить возврат метода.PHPUnit Остановка последовательных вызовов

Я не могу издеваться над этим методом, потому что я не могу создать экземпляр. Вот пример:

// Class called MyClass 
public function doSomething(){ 
    $foo = new Foo(); 
    $bar = $foo->getSomethingUnpredictable(); 

    // Doing something with $bar and saves the result in $foobar. 
    // The result is predictable if I know what $foo is. 

    return $forbar; 
} 

// The test class 
public function testDoSomething{ 
    $myClass = new MyClass(); 
    when("Foo::getSomethingUnpredictable()")->thenReturns("Foo"); 

    // Foo::testDoSomething is now predictable and I am able to create a assertEquals 
    $this->assertEquals("fOO", $this->doSomething()); 
} 

Я мог бы проверить, что Foo :: testDoSomething возвращается в тестовом модуле и так вычислить результат, но чем testDoSomething имеет только несколько отличия от DoSomething. Я также не могу проверить, что происходит с другими значениями.
doSomething не может иметь никаких параметров, поскольку используются varargs (поэтому я не могу добавить оптимальный параметр).

ответ

0

Вот почему жесткие зависимости плохие, в текущем состоянии doSomething не поддается тестированию. Вы должны реорганизовать MyClass так:

public function setFoo(Foo $foo) 
{ 
    $this->foo = $foo; 
} 
public function getFoo() 
{ 
    if ($this->foo === null) { 
     $this->foo = new Foo(); 
    } 
    return $this->foo; 
} 
public function doSomething(){ 
    $foo = $this->getFoo(); 
    $bar = $foo->getSomethingUnpredictable(); 

    // Doing something with $bar and saves the result in $foobar. 
    // The result is predictable if I know what $foo is. 

    return $forbar; 
} 

Тогда вы будете иметь возможность вводить свой высмеивали Foo экземпляр:

$myClass->setFoo($mock); 
$actualResult = $myClass->doSomething(); 

А как незавершенный метод, это зависит от вашей тестовой структуры. Потому что это (when("Foo::getSomethingUnpredictable()")->thenReturns("Foo");) не является PHPUnit.

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