【问题标题】:How can I mock the call to the database?如何模拟对数据库的调用?
【发布时间】:2020-01-25 17:58:59
【问题描述】:

您好,我正在修改我的代码以向数据库连接添加依赖注入,并询问他们是否可以帮助我理解制作模拟的感觉并能够演示 CRUD 如何与 assertEquals 一起工作,我正在测试几个例子和阅读文档,但我一点都不懂,非常感谢,我使用了phpunit

<?php 

    class metodos {

    private $conect;

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

    public function showData($sql) {
        $connection = $this->conect->conexion();
        $result = $connection->query($sql);
        return $result->fetch_all(MYSQLI_ASSOC);
    }
    public function insertData($datos){
        $connection = $this->conect->conexion();
        $sql="INSERT into agenda (nro_trans,usuario,anecdota,imagen) values ('$datos[0]','$datos[1]','$datos[2]','$datos[3]')";
        return $result=mysqli_query($connection,$sql);
    }

public function actualizaDatos($datos){
    $connection = $this->conect->conexion();
    $sql="UPDATE agenda set anecdota='$datos[2]',imagen='$datos[3]'
                            where nro_trans='$datos[0]'";
    return $result=mysqli_query($connection,$sql);

}
public function deleteData($nro_trans){
    $connection = $this->conect->conexion();
    $sql="DELETE from agenda where nro_trans='$nro_trans'";
    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
 $c = new conectar();
        $obj = new metodos($c);
        $sql="SELECT * FROM agenda";
        $datos=$obj->mostrarDatos($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>

【问题讨论】:

    标签: php html testing mocking


    【解决方案1】:

    我从不建议模拟数据库,但是你去吧,

    public function testShowDataFetchesAllRecordsAndReturns() {
      //Set up a fake database row
      $metodos =[
         [
           'id' => 1,
           'nro_trans' => 'Some trans 1'
           //fill out rest of fields that you need
         ],
         [
           'id' => 2,
           'nro_trans' => 'Some trans 2'
         ]
    
      ];
    
      $conect = $this->getMock('Conect'); // Mock your conect class
    
      $metodos = $this->getMock(
                   'metodos', // You should really use Uppercase class names
                   ['showData'] // The method that needs to be called
                   [$conect] // Constructor argument
       ];
    
      //Set up the mock to return the fake row when showData is called
      $metodos->expects($this->once())
          ->method('showData')
          ->with('SELECT * FROM metodos')
          ->will($this->returnValue($metodos));
    
        $obj = new metodos($c);
        $sql="SELECT * FROM agenda";
        $data = $obj->showData($sql);
    
    
        $this->assertEquals(1, $data[0]['id']);
        $this->assertEquals('Some trans 1', $data[0]['no_trans']);
    
    }
    

    【讨论】:

    • 感谢代码,我意识到更改因为不起作用,现在放弃此错误 调用 1 次时方法名称的预期失败等于 。方法预期调用1次,实际调用0次。
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多