2017-05-31 209 views
0

是否有可能或好主意測試該方法被嘲笑的類的參數? 例子:測試方法的測試參數

class CarType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->addEventSubscriber(new User('argument example') 

    } 
} 

這是我的測試:

public function testFormBuilder() 
    { 

    $builder = $this->getMockBuilder('Symfony\Component\Form\FormBuilder') 
     ->disableOriginalConstructor() 
     ->getMock(); 

     // Test  
     $type = new CarType(); 

      $this->builder->expects($this->once()) 
       ->method('addEventSubscriber') 
       ->with(
        $this->isInstanceOf(User::class) 
       ); 

      $type->buildForm($this->builder, []); 


    } 

這個測試做工精細,但是... 我想知道,如果User類的第一個參數是一個字符串,但可我在這個相同的測試中做?

+1

「用戶」的參數是一個合併值或'$ options'中的內容嗎?如果你真的需要檢查這是一個字符串,可能應該在'User'構造函數中通過參數驗證完成檢查,然後你可以用phpunit來測試它。 – olibiaz

回答

0

由於正在測試的代碼中直接創建User,因此無法直接進行檢查。

但是具體取決於該字符串可以通過User類的公共方法來檢索,那麼你可以做這樣的事情:

$this->builder->expects($this->once()) 
      ->method('addEventSubscriber') 
      ->with(
       $this->callback(function($user) { 
        if (! $user instanceof User) { 
         return False; 
        } 

        if ($user->getName() != <Expected String>) { 
         return False; 
        } 

        return True; 
       }) 
      ); 

可以使用User實例的回調檢查進一步的細節。您不驗證該字符串是否傳遞給構造函數,但可以檢查該對象是否已正確創建。

雖然這不是最好的解決方法。您的代碼不可擴展,因爲您無法更改User類。將User對象傳遞給傳遞的方法會更好。這將允許您將來有不同類型的User對象。