2017-04-26 1 views
0

Ich habe eine Reihe von Spezifikationen, die tun, was ich möchte sie, aber ich frage mich, ob ich Dinge übermäßig komplizieren, wie meine Funktion für einige von ihnen ziemlich groß und umständlich ist.PHPSpec: Wie mit Daten schwere Mocks in spec gehandhabt werden?

Ich habe Spezifikationen für eine Reihe von Klassen erstellt, die Antworten von SQL oder JSON API abhängig von der Antwort verarbeiten. Die Spezifikationen überprüfen nur das resultierende Objekt der Prozesse jeder Klasse. Ich habe die Verbindung verspottet, um gültige Scheindaten für jede Art von Anfrage zurückzugeben, die die Spezifikationen auslösen würden. Ich versuche, eine bessere Möglichkeit zu finden, diese Pseudodaten bereitzustellen, als ziemlich große Arrays und JSON-Strings zu haben, die gerade in den Spezifikationsdateien sitzen.

Zum Beispiel (vereinfacht):

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; 
     } 
    ]; 
    } 
} 

Ist es mir wert, die Arrays in eine separate Datei zu bewegen und laden sie in oder ist das ein nein nein?

Hinweis: Die Buildfunktionen sind so konzipiert, dass der Adapter für SQL oder die API nicht relevant ist. Er konvertiert die Daten in ein konsistentes Objekt. Daher definiert die Spezifikation nicht wirklich, was die Daten sind (in dem Beispiel, das ich zur Verfügung gestellt habe, ist es dasselbe wie eine SQL-Antwort, aber ich habe normalerweise den zweiten Eintrag formatiert, wie die JSON-Antwort sein würde, wenn sie pro Eintrag verarbeitet wird).

+0

Die Anordnung eines Tests (unabhängig von der verwendeten Bibliothek) kann manchmal mühsam sein. Wenn Sie all diese Zeichen im Array als "Fixture" benötigen, befürchte ich, dass dies das "Minimum Setup" für Ihren Test ist, damit Sie sich nicht anders verhalten können. Eine Lösung besteht darin, dieses Array auf ein Minimum an "signifikanten" Daten zu reduzieren und zu verschieben. Ich bin nicht 100% sicher, ob dieser Kommentar in Ordnung ist oder nicht, aber nach meiner Erfahrung handle ich immer so. – DonCallisto

Antwort

0

Lohnt es sich, die Arrays in eine separate Datei zu verschieben und sie zu laden oder ist das ein Nein Nein?

Nein, ist diese Anstrengung nicht wert. Sie stellen dem Konstruktor nur Daten zur Verfügung und damit sollte es in direkten Definitionen OK sein.

Verwandte Themen