2009-04-13 5 views
0

Um das Einfügen/Aktualisieren einer Zeile zu testen, habe ich einen Test geschrieben, um einen Beitrag zu simulieren, um zu überprüfen, ob er weiterleitet und um zu überprüfen, ob der neu eingefügte/aktualisierte Text auf der Seite ist. Der Code funktioniert, aber nicht der Test - können Sie mir sagen, warum es falsch ist?Wie testet eine Einheit das Hinzufügen einer Zeile zu einer Datenbank mit Zend Framework & PHPUnit?

public function testEditProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'id'=>'1', 
     'title'=>'Test Product 1a' 
    )); 
    $this->dispatch('/product/edit/id/1'); 
    $this->assertRedirectTo('/'); 
    $this->assertQueryContentContains('a', 'Test Product 1a'); 
} 
public function testAddProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'title'=>'Test Product 3' 
    )); 
    $this->dispatch('/product/add/'); 
    $this->assertRedirectTo('/'); 
    $this->assertQueryContentContains('a', 'Test Product 3'); 
} 

Die folgenden Tests beide arbeiten, zu behaupten, dass die Index-Seite mit einem ID-Parameter, um den entsprechenden Text enthält, und dass nach einem Produkt, das Produkt Titel Löschen wird nicht mehr auf der Seite angezeigt.

public function testIndexPageListsProducts() { 
    $this->dispatch('/product/index/id/1'); 
    $this->assertQueryContentContains('h1', 'Test Product 1'); 
} 

public function testDeleteProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $this->dispatch('/product/delete/id/2'); 
    $this->assertRedirectTo('/'); 
    $this->assertNotQueryContentContains('a', 'Test Product 2'); 
} 

Antwort

2

In Ihrem ersten Test ändern

$this->assertRedirectTo('/'); 
$this->assertQueryContentContains('a', 'Test Product 3'); 

zu

$this->assertRedirectTo('/'); 

$this->resetRequest(); 
$this->resetResponse(); 

$this->disptach('/'); 
$this->assertQueryContentContains('a', 'Test Product 3'); 

Wenn ich richtig bin, wird die Einheit Test-Framework nicht Umleitungen ausführen. Es verfolgt, welche Weiterleitungen angefordert wurden, führt sie aber nicht durch.

Also in Ihrem Code, überprüfen Sie für das Vorhandensein von "Test Produkt 3" in der Bearbeitungsansicht/Aktion, und dieser Test schlägt natürlich fehl. Sie sollten zuerst den Index anfordern und dann den Test durchführen.

0

danke für Ihre Hilfe. Ich fand, dass $this->resetRequest(); und $this->resetResponse(); Fehler warf, aber ich überprüfte die method summary for Zend_Test_PHPUnit_ControllerTestCase und fand $this->reset(); Die verknüpfte Seite führt die Methoden auf, die Sie erwähnen, aber sie sind unterschiedlich aufgeführt.

$this-reset(); allein warf auch einen Fehler (Kein Standard-Modul für diese Anwendung definiert), aber ich fand, dass, wenn ich $this->bootstrap(); danach die Tests bestanden. Ist das eine gültige Lösung? Zur Verdeutlichung lautet mein Testcode jetzt:

public function testEditProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'id'=>'1', 
     'title'=>'Test Product 1a' 
    )); 
    $this->dispatch('/product/edit/id/1'); 
    $this->assertRedirectTo('/'); 

    $this->reset(); 
    $this->bootstrap(); 
    $this->dispatch('/'); 
    $this->assertQueryContentContains('a', 'Test Product 1a'); 
} 
public function testAddProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'title'=>'Test Product 3' 
    )); 
     $this->dispatch('/product/add/'); 
    $this->assertRedirectTo('/'); 

    $this->reset(); 
    $this->bootstrap(); 
    $this->dispatch('/'); 
    $this->assertQueryContentContains('a', 'Test Product 3'); 
} 
Verwandte Themen