统一测试PHP&;嘲弄

统一测试PHP&;嘲弄,php,unit-testing,Php,Unit Testing,我试图编写一个测试类,但这是我第一次这么做,所以我对从类中得到的示例有点迷茫 这是我的交换班: <?php //require 'User.php'; require 'Product.php'; require 'EmailSender.php'; require 'DatabaseConnection.php'; class Exchange{ private $dateDebut; private $dateFin; private $receiver; private $p

我试图编写一个测试类,但这是我第一次这么做,所以我对从类中得到的示例有点迷茫

这是我的交换班:

<?php 

//require 'User.php';
require 'Product.php';
require 'EmailSender.php';
require 'DatabaseConnection.php';

class Exchange{

private $dateDebut;
private $dateFin;
private $receiver;
private $product;
private $owner;
private $emailSender;
private $dbConnexion;

function __construct($dateDebut, $dateFin, $receiver, $product, $owner)
{
    $this->dateDebut = $dateDebut;
    $this->dateFin = $dateFin;
    $this->receiver = $receiver;
    $this->product = $product;
    $this->owner = $owner;
    $this->emailSender = new EmailSender();
    $this->dbConnexion = new DatabaseConnection();
}


public function save($dateDebut, $dateFin)
{

    if($this->owner->isValid()){
        $checkOwner = true;
    }

    if($this->receiver->isValid()){
        $checkReceiver = true;
    }

    if($this->product->isValid()){
        $checkProduct = true;
    }

    if(!empty($dateDebut) && $dateDebut > date("Y-m-d")){
        $checkDateDebut = true;
    }

    if(!empty($dateFin) && $dateFin > date("Y-m-d") && $dateFin > $dateDebut){
        $checkDateFin = true;
    }

    if($checkProduct == true && $checkReceiver == true && $checkOwner == true && $checkDateFin == true && $checkDateDebut == true){

            if($this->receiver->age < 19){
                $this->emailSender->sendMail($this->receiver->getEmail(), "Moins de 18 ans");
            }

            // enregistrer en base
            return 12;
    }
    else{
        return false;
    }

}


// Liste des setters

public function setDateDebut($dateDebut)
{
    $this->dateDebut = $dateDebut;
}

public function setDateFin($dateFin)
{
    $this->dateFin = $dateFin;
}

public function setReceiver($receiver)
{
    $this->receiver = $receiver;
}

public function setProduct($product)
{
    $this->product = $product;
}

public function setOwner($owner)
{
    $this->owner = $owner;
}

public function setEmailSender($emailSender)
{
    $this->emailSender = $emailSender;
}

public function setDBConnexion($dbConnexion)
{
    $this->dbConnexion = $dbConnexion;
}


// Liste des getters

public function getDateDebut()
{
    return $this->dateDebut;
}

public function getDateFin()
{
    return $this->dateFin;
}

public function getReceiver()
{
    return $this->receiver;
}

public function getProduct()
{
    return $this->product;
}

public function getOwner()
{
    return $this->owner;
}

public function getEmailSender()
{
    return $this->emailSender;
}

public function getDBConnexion()
{
    return $this->dbConnexion;
}

}

?>

任何关于酉测试的帮助都会很好,谢谢,我得到的错误是函数数据仍然为null。

看起来您已经定义了一个尚未填充的属性,因此当您使用它时,没有对象可以运行方法,并且会出错

在大多数单元测试场景中,您希望每个测试尽可能独立,以避免一个测试在另一个测试中导致级联失败。将其设置为局部变量应该可以解决问题:

public function testSave()
{
  $exchange = new Exchange(...);

  $result = $this->exchange->save("2017-11-18", "2017-11-20");
  $this->assertEquals($result, 12);
}

您希望创建某种类型的
exchange()
factory方法来正确初始化
exchange
实例,以避免在每个测试中重复大量样板文件。

看起来您已经定义了一个未填充的属性,因此,当您使用它时,没有对象可以在其上运行方法,它会出错

在大多数单元测试场景中,您希望每个测试尽可能独立,以避免一个测试在另一个测试中导致级联失败。将其设置为局部变量应该可以解决问题:

public function testSave()
{
  $exchange = new Exchange(...);

  $result = $this->exchange->save("2017-11-18", "2017-11-20");
  $this->assertEquals($result, 12);
}

你想创建一个
exchange()
factory方法来正确初始化
exchange
实例,以避免在每次测试中重复大量的样板文件。

Huh老师告诉我们,如果是学术练习,我们必须从头开始做,使用单元测试绝对是确保正确执行的方法,所以做得很好。我只是担心人们这样做是因为他们认为这是必要的。我编辑了一个错误,上面写着“致命错误:在null上调用成员函数save()”哦,好吧,我想我得到了感谢,老师告诉我们,如果这是一个学术练习,我们必须从头开始做,使用单元测试绝对是确保正确执行的方法,所以做得很好。我只是担心人们这样做是因为他们认为这是必要的。我编辑了一个错误,上面写着“致命错误:在null上调用成员函数save()”哦,好的,我想我已经加入了,我忘了提到的最后一件事,我需要分别从类User、Product和其他User创建3个对象,在这些类中,我得到了检查一些参数的函数isValid,如何初始化它们?通过模拟?因为您试图测试实际代码,所以模拟在这里不相关。像往常一样初始化它们,练习它们,用断言进行验证。最后一件事我忘了提到,我需要分别从类User、Product和other User创建3个对象,在这些类中,我得到了检查一些参数的函数isValid,我如何初始化它们?通过模拟?因为您试图测试实际代码,所以模拟在这里不相关。像通常一样初始化它们、练习它们、使用断言进行验证。
public function testSave()
{
  $exchange = new Exchange(...);

  $result = $this->exchange->save("2017-11-18", "2017-11-20");
  $this->assertEquals($result, 12);
}