2016-07-26 4 views
1

Ich bin neu zu Komponententests in PHP und ich habe ein kleines Problem. Ob das daran liegt, dass ich das Cake-Framework verwende oder weil ich an die Java-Art gewöhnt bin, weise darauf hin, dass ich Probleme habe.Pass Daten Variable zu funktionieren, wenn Unit Testing

Ich schreibe Tests für eine Model-Funktion, die beim Einreichen eines Formulars aufgerufen wird. Die Funktion empfängt zwei Parameter, von denen ich glaube, dass sie korrekt übergeben werden, und ein Datenobjekt, das nicht als Parameter empfangen wird. Meine Frage ist, wie befülle ich dieses "Daten" -Objekt? Ich bekomme immer und "undefinierten Index" Fehler, wenn ich die Tests ausführen.

Ich habe versucht sowohl die Daten zu verspotten und Geräte zu verwenden, aber in aller Ehrlichkeit, bekomme ich diese Sachen nicht. Unten ist meine Modellfunktion, gefolgt von meinem Testcode.

Das ist wie die 52 Version meiner Testfunktion, also fühlen Sie sich frei, einfach zu tun, was Sie wollen. Ich dachte, dass es einfacher und schneller wäre, sich über die Daten lustig zu machen, da ich eigentlich nur die 'client_type_id' für die Bedingung in meiner Model-Funktion benötige, aber ich konnte das 'data'-Objekt nicht aktivieren. .. ohne Erfolg.

public function testIsUniqueIfVerified01() { 
    $this->Client = $this->getMock ('Client', array (
      'find' 
    )); 
    $this->Client->set(array(
       'client_type_id' => 1, 
       'identity_no' => 123456789
    )); 
    //$this->Client->log($this->Client->data); 
    $check = array (
      'identity_no' => '1234567890123' 
    ); 
    $unverified = null; 

    $this->Client = $this->getMockforModel("Client",array('find')); 
    $this->Client->expects($this->once()) 
     ->method("find") 
     ->with('first', array (
       'conditions' => array (
         "identity_no" => "1234567890123", 
         "Client.id" => "7711883306236", 
         'client_type_id <>' => 5 
       ), 
       'fields' => array (
         'Client.id' 
       ) 
     )) 
     ->will($this->returnValue(false));  

    $this->assertTrue($this->Client->isUniqueIfVerified($check, $unverified)); 

    unset ($this->Client); 
} 

Auch hier bin ich sehr grün, wenn es um Kuchen kommt und insbesondere PHP Unit Testing, so fühlen sich frei, zu erklären, wo ich schief gelaufen ist.

Danke!

Antwort

2

Sie werden eine leichte Anpassung an Ihre Modellfunktion vornehmen müssen (was ich unten zeigen würde), aber dann sollten Sie in der Lage sein, so etwas zu tun Objekt, um durch Daten in den Daten:

$this->Client->data = array(
    'Client' => array(
     'client_type_id' => 5, 
     'identity_no' => 123456789
)); 

Dies ist statt der „set“ verwendet, um Sie, wie unten:

$this->Client->set(array(... 

auch Sie das Client-Modell verspottet, dann „set“ ein paar Dinge, aber dann, kurz bevor Sie den Test durchführen, Sie verspotten es wieder. Das heißt, du wirfst alle Feinheiten weg, die du für den Spott, den du oben getan hast, gesetzt hast. Sie können etwas tun, wie unterhalb dessen sollten Sie Problem lösen:

public function testIsUniqueIfVerified01() { 
    $this->Client = $this->getMock ('Client', array (
     'find' 
    )); 
    $this->Client->data = array(
     'Client' => array(
      'client_type_id' => 5, 
      'identity_no' => 123456789
    )); 

    $check = array (
     'identity_no' => '1234567890123' 
    ); 
    $unverified = null; 

    $this->Client->expects($this->once()) 
     ->method("find") 
     ->with($this->identicalTo('first'), $this->identicalTo(array(
      'conditions' => array (
       $check, 
       "Client.id !=" => 1, 
       'client_type_id <>' => 5 
      ), 
      'fields' => array (
       'Client.id' 
      ) 
     ))) 
     ->will($this->returnValue(false));  

    $this->assertTrue($this->Client->isUniqueIfVerified($check, $unverified)); 

    unset ($this->Client); 
} 

Dies sollte Ihnen eine Vorstellung davon, zumindest geben, was zu tun ist. Ich hoffe es hilft!