2016-11-29 49 views
0

我工作的單元測試,並試圖取代的一類函數被調用別的地方,我的單元測試返回值。如何使課堂任何呼叫::功能得到莫克::功能響應

我開始Mock對象,這似乎是對我的解決方案工作。 這裏是我使用的代碼:

<?php 

namespace A; 

class SomeClass 
{ 
    public function doSomething() 
    { 
     return 20; 
    } 
} 

/** 
* @group DaTest 
*/ 
class DaTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testStub() 
    { 
     // Create a stub for the SomeClass class. 
     $stub = $this 
      ->getMock('A\SomeClass', array('doSomething')) 
     ; 

     // Configure the stub. 
     $stub 
      ->expects($this->any()) 
      ->method('doSomething') 
      ->willReturn(1) 
     ; 

     $a = new SomeClass(); 

     var_dump($stub->doSomething)); // Return 1 
     var_dump($a->doSomething()); // Return 20 -.-' 
    } 
} 

正如你看到的,我覺得我被迫使用模擬得到「1」返回。 但我的目標是使SomeClass的任何實例返回1,但僅用於我的單元測試。

我錯過了什麼? 有關我如何實現這一點的任何想法?

Thx。

編輯: 爲準確顯示什麼,我試圖做我有另外一個代碼是:

<?php 

namespace A; 

class SomeClass2 
{ 
    public function showSomething() 
    { 
     $class = new SomeClass(); 
     // Here print 20, I want it to print 1 in my unit test 
     echo $class->doSomething(); 
    } 
} 

所有我想要的是讓SomeClass2::showSomething()打印1在我的單元測試和20時,我把它叫做在非測試環境=)

+0

如果你想防止功能的原始行爲,你做的一切權利 –

+0

嗯,我想'''$ A-> DoSomething的()'''回報「 1「,因爲在我的情況下,我想要」覆蓋「的函數不是直接在我的測試中調用,而是在某些函數的代碼中進行測試調用,所以我不能發送它的模擬。 – LordWeedlle

+0

明白了,您要測試的功能可能無法正確寫入。讓我們更接近您的原始代碼。那麼它會更容易地幫助你 –

回答

1

所以,你需要做的是注入SomeClass的實例作爲參數傳遞給showSomething()函數。因此,你可以嘲笑SomeClass的

<?php 

namespace A; 

class SomeClass2 
{ 
    public function showSomething(SomeClass $classInstance) 
    { 
     echo $classInstance->doSomething(); 
    } 
}