【问题标题】:How can I mock the call to the database with this code?如何使用此代码模拟对数据库的调用?
【发布时间】:2020-01-24 14:55:38
【问题描述】:

我正在更改我的代码以将其传递给对象,并想知道现在是否可以模拟对数据库的调用以使用 PHPUnit 执行单元测试,或者是否需要更改其他内容。

具有数据库方法的类

<? php

class methods {
    public function showData ($ sql) {
        $c = new connect();
        $connection = $c->connection();

        $result = mysqli_query ($connection, $sql);
        return mysqli_fetch_all ($result, MYSQLI_ASSOC);
    }

    public function insertDataName ($data) {
        $c = new connect();
        $connection = $c->connection();

        $sql = "INSERT into agenda (nro_trans, user, anecdote, image)
                values ('$data[0]','$data[1]','$data[2]','$data[3]') ";

        return $result = mysqli_query($connection, $sql);
    }

调用该方法以使用并将取自html的数据插入到一个数组中

<? php
require_once "conect.php";
require_once "metodosCrud.php";

$nro_trans = $_POST['nro_trans'];
$user = $_POST['user'];
$anecdote = $_POST['anecdote'];
$image = $_FILES['image'];


$filename = $_FILES['image']['name']; // To know the name of the file
$path = "../imagenes/". $filename; // The file path contains the new name and extension type
$file = $_FILES['image']['tmp_name']; // the file to upload
$upload = move_uploaded_file ($file, $path); //

$data = array (
        $nro_trans,
        $user,
        $anecdote,
        $route
    );
$obj = new methods();
if ($obj-> insertDataName($data) == 1) {
    echo '<script>
            alert ("Anecdote entered correctly !!");
            ; window.location.href = "../model/agenda.php";
            </script> ';
} else {
    echo "failed to add";
}
?>

索引

<! DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<title> Tourism </title>
<link href = 'http: //fonts.googleapis.com/css? family = Open + Sans: 400,700,400italic' rel = 'stylesheet' type = 'text / css'>
<link rel = "stylesheet" href = "css / styles.css">
<link rel = "stylesheet" href = "css / normalize.css">
</head>
<body>
<header>

<div class = "holder">
    <section class = "logo">
        <img src = "gallery / logo.jpg" alt = "logo">
    </section>

    <h1> National and International Tourism </h1>

    <div id = "facebook">
        <p> <a href="http://www.facebook.com/" target="_blank"> <img alt = "Follow us on Facebook" src = "https://lh6.googleusercontent.com/-CYt37hfDnQ8/ T3nNydojf_I / AAAAAAAAAr0 / P5OtlZxV4rk / s32 / facebook32.png "width = 32 height = 32 /> </a> </p>
    </div>

</div>

<div id = "twitter">

    <a href="http://twitter.com/" target="_blank"> <img src = "https://lh6.googleusercontent.com/--aIk2uBwEKM/T3nN1x09jBI/AAAAAAAAAs8/qzDsbw3kEm8/s32png "width = 32 height = 32 alt =" Follow us on Twitter "/> </a>
</div>


</header> <! - / header ->

<nav>
    <div class = "holder">

    <ul>
        <li> <a href="index.php" title=""> Home </a> </li>
        <li> <a href="#"> Where do I travel? </a>
        <ul>
            <li> <a href="provincias.html"> Argentine Provinces </a> </li>
            <li> <a href="#"> Continents </a>
            <ul>
                <li> <a href="vistas/america.html"> America </a> </li>
                <li> <a href="vistas/europa.html"> Europe </a> </li>
                <li> <a href="vistas/asia.html"> Asia </a> </li>
             </ul>
        </ul>
        </li>
        </li>
        <li> <a href="services.html" title=""> Services </a> </li>
        <li> <a href="pay.html" title=""> Payment Methods </a> </li>
        <li> <a href="agenda.php" title=""> Agenda </a> <li>
        <li> <a href="contact.html" title=""> Contact </a> <li>
    </ul>
</div>

</nav>

<section class = "holder">
    <h2> Traveler's agenda </h2>
        <div class = "column left">
            <p> Enter the anecdote you want to save. You have the option to delete and delete available if you are logged in to the page </p>

            <table style = "margin: auto; width: 800px; border-collapse: separate; border-spacing: 10px 5px;">
              <thead>
              <th> Nro Anecdota </th>
              <th> User </th>
              <th> Description </th>
              <th> Image </th>
              <th> <a href="agnewNew.php"> <button type = 'button' class = 'btn btn-info'> New </button> </a> </th>

<? php
$obj = new methods ();
$sql = "SELECT * FROM agenda";
$data = $obj-> show Data ($ sql);
// show data on screen
echo "<tr>";
    echo "<td>"; echo $row ['nro_trans']; echo "</td>";
    echo "<td>"; echo $row ['user']; echo "</td>";
    echo "<td>"; echo $row ['anecdote']; echo "</td>";
  // echo "<td>"; echo $row ['image']; echo "</td>";
    echo "<td>"; echo "<img src = '". $row ['image']. "' width = '300'>"; echo "</td>";
    echo "<td> <a href='modify.php?nro_trans=".$fila['nro_trans'[."'> <button type = 'button' class = 'btn btn-success'> Modify </button> </a> </td> ";
    echo "<td> <a href='eliminarAnecdota.php?nro_trans=".$fila['nro_trans'[."'> <button type = 'button' class = 'btn btn-danger' onclick = 'return ConfirmDelete() '> Remove </button> </a> </td> ";

echo "</tr>";
}
?>

<script type="text/javascript">
function ConfirmDelete () {
    var answer = confirm ("Are you sure you want the anecdote?");

    if (answer == true) {
        return true;
    } else {
    }
    return false;
}
</script>

    </thead>
    </table>
</div>

</section>

<footer>
    <p>
    National and International Tourism
     Homemade Buenos Aires Argentina, Valentín Gómez 4772, B1678
     turismo_nacional_internacional@hotmail.com- Tel. / Fax: +54 11 4575-5012
    </p>

    <p> Copyright 2020: Design and Programming: Ezequiel Ledesma </p>
</footer> 
</body>
</html>

谢谢

【问题讨论】:

  • 开玩笑???你的意思是做一个函数吗?
  • 良好的代码缩进将帮助我们阅读代码,更重要的是,它将帮助您调试代码Take a quick look at a coding standard 为您自己的利益。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • @RiggsFolly 我想我必须修复桑格利亚汽酒,但我仍然没有时间了解如何配置 sublimetext,我想让模拟能够执行单元测试将模拟与价值与另一个进行比较的杂物
  • 我/我们仍然不确定>它
  • 我认为“取笑”可能是翻译错误。虽然它通常是模拟的同义词,但在这种情况下它并不真正意味着同样的事情。如果我弄错了,我深表歉意。

标签: php html testing mocking


【解决方案1】:

为了模拟查询,您需要进行两项更改。

  1. 注入连接对象而不是在方法中实例化它
  2. 使用面向对象的 mysqli 接口而不是过程接口。

class methods {

    protected $connect;

    // This way you can inject either the real connection object or the mock

    public function __construct($connect) {
        $this->connect = $connect;
    }

    // Using object methods here rather than procedural functions that require
    // specific built-in objects like `mysqli_result` will let your method use
    // either the real connection or the mock

    public function showData($sql) {
        $connection = $this->connect->connection();
        $result = $connection->query($sql);
        return $result->fetch_all(MYSQLI_ASSOC);
    }
    // ... (make similar adjustments to the other methods)

如果您进行了这些更改,那么您可以使用必要的方法创建一个模拟对象。这是一个使用匿名类的基本示例。对于您决定进行的任何测试,您都可以对其进行调整,使其尽可能复杂。如果您使用的是 PHPUnit,您可以使用它的模拟对象设置类似的东西。

$mockConnection = new class {
    function connection() {
        return new class() {
            function query($sql) {
                return new class() {
                    function fetch_all($fetchStyle) {
                        return [
                            ['col1Name' => 'col1ValueA', 'col2Name' => 'col2ValueA'],
                            ['col1Name' => 'col1ValueB', 'col2Name' => 'col2ValueB']
                        ];
                    }
                };
            }
        };
    }
};

$testInstance = new methods($mockConnection);

$testResult = $testInstance->showData('SELECT etc.');

【讨论】:

  • 谢谢,我至少已经展示了依赖注入,只要我可以修改其余部分,我就会看到如何使用您添加的内容制作模拟
  • 一个问题,用这个例子做 assertEquals 是要求我比较一个数组,这是因为我没有意识到
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多