2017-04-26 50 views
0

我有一系列的規格正在做我希望他們做的事情,但我想知道我是否過於複雜,因爲我的let函數對於其中的一些而言是相當龐大和繁瑣的。PHPSpec:如何處理規範中的數據嘲諷?

我已經構建了一系列處理來自SQL或JSON API的響應的類的規範,具體取決於響應。規範只是檢查每個類的過程的結果對象。我已經嘲笑了連接,以便爲規範會觸發的每種請求返回有效的模擬數據。我試圖想出一個更好的方式來提供這個模擬數據,而不是隻有坐在spec文件中的相當大的數組和JSON字符串。

例如(簡體):

class CharacterProcessorSpec extends ObjectBehavior 
{ 
    public function let(AdapterInterface $adapter) 
    { 
    $characters = [ 
     [ 
     'name' => 'Timmy', 
     'class' => 'Fighter', 
     'level' => 1, 
     'race' => 'Elf', 
     'str' => 16, 
     'dex' => 14, 
     'con' => 18, 
     'int' => 10, 
     'wis' => 12, 
     'cha' => 11, 
     ... // Rest of the minimally required fields 
     ], [ 
     ... // Second character for processing multiple at once 
     ] 
    ]; 
    $adapter->fetch(new CharacterRequest('Timmy'))->willReturn([$characters[0]]); 
    $adapter->fetch(new CharacterRequest('*'))->willReturn($characters); 
    $this->beConstructedWith($adapter); 
    } 

    public function it_should_build_requested_character_details() 
    { 
    $this->build('Timmy')->shouldReturnArrayOfCharacters(); 
    } 

    public function it_should_build_all_character_details() 
    { 
    $this->buildAll()->shouldReturnArrayOfCharacters(); 
    } 

    public function getMatchers() 
    { 
    return [ 
     'returnArrayOfCharacters' => function($characters) { 
     foreach ($characters as $c) { 
      if (!$c instanceof Character) { 
      return false; 
      } 
     } 
     return true; 
     } 
    ]; 
    } 
} 

是否值得我在移動陣列到一個單獨的文件,並加載它們或者是一種沒有沒有?

注意:構建函數被設計爲不關心適配器是用於SQL還是API,它只是將數據轉換爲一致的對象。因此規範並沒有真正定義數據是什麼(在我提供的例子中,它與SQL響應相同,但我通常將第二個條目格式化爲JSON響應如何按每個條目進行處理)。

+0

安排測試的一部分(獨立於您使用的庫)可能有時很麻煩。如果你需要「夾具」陣列中的所有字符,恐怕這是你測試的「最小設置」,所以你不能採取不同的行動。一種解決方案是將該陣列減少到最小「重要」數據集並移動。我不是100%肯定這個評論是否可以,但以我的經驗,我總是這樣做。 – DonCallisto

回答

0

是否值得我移動數組到一個單獨的文件並加載它們或是一個不是?

不,不值得這個努力。您僅向構造函數提供數據,並且在直接定義中應該沒問題。