作为一个练习,我试图用PHPUnit达到100%的代码覆盖率,这几乎就在那里,但这是我发现很难的错误位。使用PHPUnit和PDO测试覆盖率
我有一个例子类,我有一个类似的问题,我的真实代码,确切的代码不是问题,但行为是相同的。
class DBAccess {
private $db;
public function __construct(\PDO $db) {
$this->db = $db;
}
public function select() {
$data = false;
if ($stmt = $this->db->prepare("select * from user")){
if ($stmt->execute()){
$data = $stmt->fetchAll();
}
else {
echo "Something went wrong"; // How to get here!
}
}
return $data;
}
}
这是停止100%覆盖的一条线。困难是我需要准备通过,但执行失败。我已经通过传递无效的外键或字段到大表来处理更新,但是对于select,我不确定会出现什么问题。
我的测试是...
class DBAccessTest extends TestCase {
private $pdo;
public function setUp() {
$this->pdo = new PDO("mysql:host=172.18.0.2;dbname=test",
"test", "RkqwD1gjOdjkrwTt");
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
public function testSelect() {
$test = new DBAccess($this->pdo);
$this->assertTrue($test->select() != false);
}
}
有两种可能性,我能想到的
- 假设,如果准备工作过,该执行的意志为好,但也不是特别快乐接着就,随即。
- 以某种方式覆盖连接,使其以受控方式失败。
这是确切的功能?它没有采取任何参数? – ishegg
这是嘲笑的。 '\ PDO'应该用它的模拟来代替。 http://erichogue.ca/2013/02/best-practices/mocking-pdo-in-phpunit/ – Axalix
@ishegg这不是确切的功能,因为我提到它是一个简单的例子。关键部分是,我无法想到一旦准备工作,如何做出选择失败。 –