Wie zu bewahren Sitzung durch alle tests auf phpunit?
Arbeite ich auf Tests, die einen Warenkorb, Kasse, Bezahlvorgang, die auf Zend-Framework phpunit. Ich Teste ShoppingCartController
durch hinzufügen von Produkten zum Warenkorb, ein ShoppingCart
Modell Griffe Produkt-Ergänzungen durch die Speicherung von Produkt-id ' s in einer Zend Session Namespace, und dann in einem anderen test ich möchte testen, ob die Produkte Hinzugefügt wurden. Das gleiche ShoppingCart
Modell ruft eine Liste der hinzugefügten Produkte aus der gleichen Zend Session namespace-variable.
Hinzufügen Produkt-test sieht wie folgt aus und funktioniert gut, und die var_dump($_SESSION)
wurde Hinzugefügt, um debugging und zeigt die Produkte korrekt:
public function testCanAddProductsToShoppingCart() {
$testProducts = array(
array(
"product_id" => "1",
"product_quantity" => "5"
),
array(
"product_id" => "1",
"product_quantity" => "3"
),
array(
"product_id" => "2",
"product_quantity" => "1"
)
);
Ecommerce_Model_Shoppingcart::clean();
foreach ($testProducts as $product) {
$this->request->setMethod('POST')
->setPost(array(
'product_id' => $product["product_id"],
'quantity' => $product["product_quantity"]
));
$this->dispatch($this->getRouteUrl("add_to_shopping_cart"));
$this->assertResponseCode('200');
}
$products = Ecommerce_Model_Shoppingcart::getData();
$this->assertTrue($products[2][0]["product"] instanceof Ecommerce_Model_Product);
$this->assertEquals($products[2][0]["quantity"],
"8");
$this->assertTrue($products[2][1]["product"] instanceof Ecommerce_Model_Product);
$this->assertEquals($products[2][1]["quantity"],
"1");
var_dump($_SESSION);
}
Zweiten test versucht, abrufen der Produkte von Fragen, das Modell so zu tun, die var_dump($_SESSION)
null ist bereits am Anfang der Prüfung. Die session-Variablen zurückgesetzt wurden, möchte ich einen Weg finden, Sie zu konservieren, kann jemand helfen?
public function testCanDisplayShoppingCartWidget() {
var_dump($_SESSION);
$this->dispatch($this->getRouteUrl("view_shopping_mini_cart"));
$this->assertResponseCode('200');
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sorry für den Hinweis, die Sie in die falsche Richtung. Hier ist ein Weg besser Weg dies zu erreichen, vorgeschlagen von ashawley von #phpunit-channel von irc.freenode.net:
== ENDE UPDATE
Zum Beispiel, dieser test schlägt fehl, wenn Sie entfernen die Funktionen setUp() und tearDown() Methoden:
Gibt es auch ein backupGlobals Funktion aber es funktioniert nicht für mich. Sie sollten es versuchen, dachte, vielleicht funktioniert es auf stabile PHPUnit.
das ist eine sehr hässliche, das zu tun. Der richtige Weg sollte sein, mithilfe von dependency injection.
Impliziert ändern Sie Ihre source-code, um diese Klasse zu verwenden anstelle von sessions direkt:
Zusätzliche Informationen:
Können Sie auch nur eine zufällige session-id für Ihre PHPUnit test, und dann stellen Sie sicher, Sie passieren diese session-id in einem cookie in jedem weiteren Anruf, den Sie machen. Mit Curl, verwenden Sie die
CURLOPT_COOKIE
option und legen Sie es auf'PHPSESSID=thesessionidofyourunittest'
als solche:Ich genauer erläutert und mit einem Beispiel in diese stackoverflow-Antwort.