我正在尝试一些 PHP 和 Codeception 验收测试,我想在验收测试中上传一个文件。我在网上进行了无数搜索,但我无法让它为我工作。下面是我的 HTML 表单片段,我在其中上传了文件。
<label for="file">Upload File:</label>
<input type="file" id="file" name="file"><br>
这是我在 process.php 中处理它的方法。请注意,我只希望在(除其他外)上传文件后获得成功的结果。 进程.php:
<?php
$password = $_POST['gen_pass'];
$car = $_POST['car'];
if(isset($_POST['refuse'])){
$refuse_check = true;
}
else{
$refuse_check = false;
}
if(isset($_POST['file'])){
$file_check = true;
}
else{
$file_check = false;
}
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['agree']) && $password == "password" && $car != "Subaru Vivio" && $file_check == true && $refuse_check == false){
$firstname = $_POST["firstname"];
$lastname = $_POST["lastname"];
$age_group = $_POST['age'];
$dob = $_POST['dob'];
echo "Hello, " . $firstname . " " . $lastname . ". You are in this age group: " . $age_group . ". Born on " . $dob . ". You've selected the " . $car . ".";
}
elseif(is_null($_POST['agree'])){
echo "Access denied! You need to agree";
}
elseif($password != "password"){
echo "Access denied! Incorrect password";
}
elseif($car == "Subaru Vivio"){
echo "Access denied! Wrong car selected";
}
elseif($file_check == false){
echo "Access denied! No file added";
}
elseif($refuse_check == true){
echo "Access denied! You need to refuse";
}
else{
echo "Access denied! Something else went wrong.";
}
?>
<a href="return.php" id="return">Click</a>
是的,我知道像我如何设置密码这样的东西在安全方面没有任何意义,但同样,我只是在玩这个以熟悉测试的工作原理。
最后,下面是我的测试代码。
$I->amGoingTo("Fill in the form correctly, then return to form page");
$I->amOnPage("/index.html");
$I->seeInTitle("Register");
$I->dontSeeInTitle("Log In");
$I->seeNumberOfElements('form', 1);
$I->seeNumberOfElements('input', 12);
$I->seeNumberOfElements('label', 13);
$I->seeNumberOfElements('option',3);
$I->seeNumberOfElements('select', 1);
$I->fillField("firstname", "Martin");
$I->fillField("lastname", "Boersma");
$I->fillField('input[name="dob"]', '2002-02-26');
$I->seeInField('gen_pass','password');
$password = $I->grabValueFrom('#gen_pass');
$I->fillField('password', $password);
$I->seeElement("#car");
$I->selectOption('#car', 'Daihatsu Copen');
$I->seeOptionIsSelected('#car', 'Daihatsu Copen');
$I->seeElement('#young');
$I->selectOption('age', '20-24');
$I->seeOptionIsSelected('#young', '20-24');
$I->attachFile('file', 'file.txt');
$I->seeElement('#agree');
$I->checkOption('#agree');
$I->seeCheckboxIsChecked('#agree');
$I->seeElement('#refuse');
$I->seeCheckboxIsChecked('#refuse');
$I->uncheckOption('#refuse');
$I->click("Submit");
$I->see("Hello, Martin Boersma. You are in this age group: 20-24. Born on 2002-02-26. You've selected the Daihatsu Copen.");
$I->dontSee("Access denied!");
$I->amOnPage("/process.php");
$I->seeElement('#return');
$I->seeLink('Click', 'return.php');
$I->click("#return");
$I->amOnPage("/return.php");
$I->see("You're on the return page.");
那么测试结果是什么?我收到在 process.php 中设置的错误,“访问被拒绝!未添加文件。”。因此,我可以看出 $I->attachFile('file', 'file.txt') 行不起作用。它正在寻找的 HTML 元素的名称“file”也是正确的,否则测试错误消息会这样说。文件名“file.txt”也是如此,它存在,否则测试会告诉我它不存在。
我在这里读到:https://github.com/Codeception/Codeception/issues/5838#:~:text=Codeception%20attachFile%20doesn%27t%20do%20much AttachFile 没有做太多事情。我可能使用错误,但我找不到如何正确地将文件上传到我的表单。另外,当我在浏览器中手动测试它时,它确实有效。我尝试回显 $file_check 变量,当我手动测试它时,它确实设置为 true,但在验收测试中却没有设置为 true。这可能是 AttachFile() 的限制吗?如果是这样,您建议我使用什么来将文件上传到此表单?
您在
Codeception
验收测试和文件上传方面遇到的问题是因为 PHP
管理文件上传以及与 $_POST
和 $_FILES
超全局变量交互的方式。当通过 HTML
表单上传文件时,PHP 将有关上传文件的详细信息存储在 $_FILES
数组中,而不是 $_POST
数组中。因此,使用 isset($_POST['file'])
确认文件上传不起作用,因为不会为文件上传设置 $_POST['file']
。相反,您应该检查 $_FILES
数组。
像这样调整你的
process.php
文件:
// Checks if a file was uploaded by checking the $_FILES array
if(isset($_FILES['file']['name']) && $_FILES['file']['error'] == UPLOAD_ERR_OK){
$file_check = true;
} else {
$file_check = false;
}