如何使用PHPUnit测试特定方法


How to test specific methods with PHPUnit

我需要PHPUnit和一些方法的帮助。你们应该如何在PHPUnit中编写测试,以达到以下属性和方法的高代码覆盖率?

我是PHPUnit的新手,可能需要一些帮助。我刚刚为更基本的代码编写了一些测试用例。此类为最终用户生成flash消息,并将其存储在会话中。

非常感谢您的帮助。有什么想法吗?

private $sessionKey = 'statusMessage';
private $messageTypes = ['info', 'error', 'success', 'warning']; // Message types.
private $session = null;
private $all = null;
public function __construct() {
    if(isset($_SESSION[$this->sessionKey])) {
        $this->fetch();
    }
}
public function fetch() {
    $this->all = $_SESSION[$this->sessionKey];
}
public function add($type = 'debug', $message) {
    $statusMessage = ['type' => $type, 'message' => $message];
    if (is_null($this->all)) {
        $this->all = array();
    }
    array_push($this->all, $statusMessage);
    $_SESSION[$this->sessionKey] = $this->all;
}
public function clear() {
    $_SESSION[$this->sessionKey] = null;
    $this->all = null;
}
public function html() {
    $html = null;
    if(is_null($this->all))
        return $html;
    foreach ($this->all as $message) {
        $type = $message['type'];
        $message = $message['message'];
        $html .= "<div class='message-" . $type . "'>" . $message . "</div>";
    }
    $this->clear();
    return $html;
}

我设置了一个设置案例,如下所示:

protected function setUp() {
    $this->flash = new ClassName();
}

还尝试了一个测试用例:

public function testFetch() {
    $this->assertEquals($this->flash->fetch(), "statusMessage", "Wrong session key.");
}

但收到一条错误消息,告诉我:"未定义的变量:_SESSION"如果我尝试:

public function testFetch() {
    $_SESSION = array();
    $this->assertEquals($this->flash->fetch(), "statusMessage", "Wrong session key.");
}

我收到另一条错误消息:"Undefined index:statusMessage"

试试这样的东西:

    function testWithoutSessionKey() { 
$_SESSION = array(); 
$yourClass = new YourclassName(); 
$this->assertNull($yourClass->html()); } 
function testWithSomeSessionKey() { 
$_SESSION = array( 'statusMessage' => array(...)); 
$yourClass = new YourclassName(); 
$this->assertSame($expect, $yourClass->html()); 
} 
  1. 你不能在setup中实例化你的类,因为你的构造函数需要SESSION变量可能存在(这样你就可以测试里面可能有一些值)
  2. 您只能评估(断言)方法的输出,因此不能断言方法返回的消息fetch

在您的方法testFecth中,您发现了一个错误!感谢测试。试着像在构造中那样通过检查来修复它:

public function fetch() {
if (isset($_SESSION[$this->sessionKey]))
    $this->all = $_SESSION[$this->sessionKey];
}    

希望这能帮助