gpt4 book ai didi

forms - PHPUnit:使用存储在 Symfony2 中的 session 变量测试表单提交

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:51 28 4
gpt4 key购买 nike

我用 PHP 为我用 Symfony2 编写的 Controller 做了一个小测试:

class DepositControllerTest extends WebTestCase {

public function testDepositSucceeds() {

$this->crawler = self::$client->request(
'POST',
'/deposit',
array( "amount" => 23),
array(),
array()
);

$this->assertEquals(
"Deposit Confirmation",
$this->crawler->filter("title")->text());
}
}

到目前为止,一切都很好。当我意识到我想在刷新页面时禁用可能的重新提交时,问题就开始了。所以我添加了一个小机制来在每次提交时发送随机数。

它的工作原理是这样的:

class ReplayManager {

public function getNonce() {
$uid = $this->getRandomUID();
$this->session->set("nonce", $uid);
return $uid;
}

public function checkNonce($cnonce) {

$nonce = $this->session->get("nonce");

if ($cnonce !== $nonce)
return false;

$this->session->set("nonce", null);
return true;
}
}

所以我不得不修改 Controller 以在显示表单时获取随机数,并在提交时使用它。

但是现在这引入了一个问题。我无法向 POST/deposit 发出请求,因为我不知道要发送什么 nonce。我想先请求 GET/deposit 来呈现表单,然后设置一个,以便在 POST 中使用它,但我怀疑 Symfony2 session 在 PHPUnit 中不起作用。

我该如何解决这个问题?我不想去进行 Selenium 测试,因为它们的速度要慢得多,更不用说我将不得不重写很多测试。

更新:我应要求添加了一个非常简化的 Controller 代码版本。

class DepositController extends Controller{

public function formAction(Request $request){

$this->replayManager = $this->getReplayManager();
$context["nonce"] = $this->replayManager->getNonce();

return $this->renderTemplate("form.twig", $context);
}

protected function depositAction(){

$this->replayManager = $this->getReplayManager();
$nonce = $_POST["nonce"];

if (!$this->replayManager->checkNonce($nonce))
return $this->renderErrorTemplate("Nonce expired!");

deposit($_POST["amount"]);

return $this->renderTemplate('confirmation.twig');
}

protected function getSession() {
$session = $this->get('session');
$session->start();
return $session;
}

protected function getReplayManager() {
return new ReplayManager($this->getSession());
}

}

最佳答案

我不确定 ReplayManager 做了什么,但在我看来它不是处理“nonce”的正确类。由于“随机数”最终存储在 session 中并从 session 中检索,因此它应该由 Controller 处理或抽象到它自己的类中,然后作为依赖项传入。这将允许您模拟随机数(听起来像情景喜剧!)以进行测试。

根据我的经验,测试中的问题实际上是代码设计的问题,应该被认为是一种气味。在这种情况下,您的问题源于在错误的地方处理随机数。快速重构 session 应该可以解决您的测试问题。

关于forms - PHPUnit:使用存储在 Symfony2 中的 session 变量测试表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836764/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com