如何在Codeception中使用attachFile()附加文件

问题描述 投票:0回答:1

我正在尝试一些 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() 的限制吗?如果是这样,您建议我使用什么来将文件上传到此表单?

php codeception acceptance-testing
1个回答
0
投票

您在

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.