【发布时间】:2015-03-15 07:49:23
【问题描述】:
我对 PHPUnit 还是很陌生,我正在尝试找出如何最好地测试第 3 类中所示的方法。
我了解模拟数据库的工作原理(我认为),因为它们可以根据输入、来自 XML 文件等返回值。我不确定如何为第三个示例提供数据,当 SQL 查询是在方法本身内部运行。
我正在尝试测试从数据库访问信息并对其执行操作的代码。目前无法将模拟的数据库数据(例如数组)提供给这些方法。
问题:向内部处理所有 SQL 查询的方法提供数据的最佳方式是什么?
<?php
class ThisMakesSense {
public function checkPassword($original, $hash) {
return (md5($original) == $hash);
}
}
class ThisMakesSenseTest {
public function testCheckPassword() {
$tms = new ThisMakesSense();
$data = array('jdoe@example.com' => 'password1', 'bsmith@example.com' => 'password2');
foraech ($data as $email => $password) {
$hash = $this->mockDB()->doStuff()->getPasswordHashByEmail($email);
$this->assertTrue($tms->checkPassword($password, $hash), "Password for {$email} is invalid");
}
$tms->checkPassword($password, $hash);
}
}
/* The '$this->_db' object is basically an OOP way of using the
* mysql_* /mysqli_* functions. Replacing it is not an option
* right now.
*/
class DontUnderstand {
public function checkPassword($email, $password) {
$this->_db->query("SELECT password_hash FROM users WHERE email = '{$email}'");
$row = $this->_db->fetchAssoc();
return (md5($password) == $row['password_hash']);
}
}
class DontUnderstandTest extends PHPUnit_Framework_TestCase {
public function testCheckPassword() {
$du = new DontUnderstand();
$data = array('jdoe@example.com' => 'password1', 'bsmith@example.com' => 'password2');
foreach ($data as $email => $pass) {
$this->assertTrue($du->checkPassword($email, $pass), "Password for {$email} is invalid");
}
}
}
(为了省去别人评论的麻烦,md5和查询方法只是一个简单的例子)
【问题讨论】:
标签: php mysql unit-testing mocking phpunit