如何在 phpunit 上的所有测试中保留会话?
我正在使用 phpunit 在 Zend Framework 上测试购物车、结帐、付款流程。我正在通过将产品添加到购物车来测试 ShoppingCartController
,ShoppingCart
模型通过将产品 id 存储在 Zend 会话命名空间中来处理产品添加,然后在我想测试的另一个测试中产品已添加。相同的 ShoppingCart
模型从相同的 Zend Session 命名空间变量中检索添加的产品列表。
添加产品测试如下所示并且运行良好,并且添加了 var_dump($_SESSION)
来调试并正确显示产品:
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);
}
第二个测试尝试通过要求模型执行此操作来检索产品,var_dump($_SESSION)
在测试开始时就已经为 null。 会话变量已重置,我想找到一种方法来保留它们,有人可以帮忙吗?
public function testCanDisplayShoppingCartWidget() {
var_dump($_SESSION);
$this->dispatch($this->getRouteUrl("view_shopping_mini_cart"));
$this->assertResponseCode('200');
}
I'm working on testing a shopping cart, checkout, payment process on Zend Framework with phpunit. I'm testing ShoppingCartController
by adding products to cart, a ShoppingCart
Model handles product additions by storing product id's in a Zend Session Namespace, and then in another test I want to test that the products were added. The same ShoppingCart
Model retrieves a list of added products from the same Zend Session namespace variable.
The add product test looks like this and works well, and the var_dump($_SESSION)
was added to debug and shows the products correctly:
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);
}
The second test attempts to retrieve the products by asking the model to do so, the var_dump($_SESSION)
is null already at the beginning of the test. The session variables were reset, I want to find a way to preserve them, can anyone help?
public function testCanDisplayShoppingCartWidget() {
var_dump($_SESSION);
$this->dispatch($this->getRouteUrl("view_shopping_mini_cart"));
$this->assertResponseCode('200');
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
抱歉给您指出了错误的方向。这是实现此目标的更好方法 ,由 irc.freenode.net #phpunit 频道的ashawley 建议:
== END UPDATE
例如,当您删除函数 setUp() 和tearDown() 方法时,此测试失败:
此外还有一个 backupGlobals 功能 但它对我不起作用。你应该尝试一下,也许它可以在稳定的 PHPUnit 上运行。
Sorry for pointing you in the wrong direction. Here is a way better way of achieving this, suggested by ashawley from #phpunit channel of irc.freenode.net:
== END UPDATE
For example, this test fails when you remove the functions setUp() and tearDown() methods:
Also there is a backupGlobals feature but it doesn't work for me. You should try it thought, maybe it works on stable PHPUnit.
这样做是非常丑陋的。正确的方法应该是使用依赖注入。
这意味着更改源代码以直接使用此类而不是会话:
附加信息:
that's a very ugly of doing that. The right way should be using dependency injection.
That implies changing your source code to use this class instead of sessions directly:
Additional information:
您还可以为 PHPUnit 测试创建一个随机会话 ID,然后确保在每次进一步调用时在 Cookie 中传递此会话 ID。对于 Curl,您可以使用
CURLOPT_COOKIE
选项并将其设置为'PHPSESSID=thesessionidofyourunittest'
,如下所示:我在 这个 stackoverflow 答案。
You can also just create a random session id for your PHPUnit test, and then make sure you pass this session id in a cookie in every further call you make. With Curl, you would use the
CURLOPT_COOKIE
option and set it to'PHPSESSID=thesessionidofyourunittest'
as such:I explained more in detail and with an example in this stackoverflow answer.