php - PHPUnit 测试一个依赖于另一个方法的方法
问题描述
这是我的数据库类,我想测试rowCount方法返回正确的值:
namespace MyProject\Database;
class Database {
// database connection
private $conn = NULL;
// holds query statement object
private $statement = NULL;
public function __construct(\PDO $conn) {
$this->conn = $conn;
}
public function query(string $query, array $parameters=[]) : bool {
$this->statement = $this->conn->prepare($query);
return $this->statement->execute($parameters);
}
public function rowCount() : int {
return $this->statement->rowCount();
}
}
我首先编写了这个单元测试来测试rowCount方法,但正如你所见,我还使用了query方法来运行查询:
class DatabaseTest extends \PHPUnit\Framework\TestCase {
/** @test */
public function rowCountReturnsCorrectNumber() {
$pdo = new \PDO('sqlite::memory:');
$db = new \MyProject\Database\Database($pdo);
// we are not testing query method here but we use it to run the query
$db->query("CREATE TABLE test (id INT UNSIGNED PRIMARY KEY)");
$db->query("INSERT INTO test (id) VALUES (1),(2)");
$this->assertEquals(2,$db->rowCount());
}
}
我认为查询方法将来可能会出错,所以我为什么要依赖它。我写这个是为了避免它:
class DatabaseTest extends \PHPUnit\Framework\TestCase {
/** @test */
public function rowCountReturnsCorrectNumber() {
$pdo = new \PDO('sqlite::memory:');
$db = new \MyProject\Database\Database($pdo);
$s = $pdo->prepare("CREATE TABLE test (id INT UNSIGNED PRIMARY KEY)");
$s->execute();
$s2 = $pdo->prepare("INSERT INTO test (id) VALUES (1),(2)");
$s2->execute();
// here I set statement (private property)
$reflection = new \ReflectionClass($db);
$property = $reflection->getProperty('statement');
$property->setAccessible(true);
$property->setValue($db, $s2);
$this->assertEquals(2,$db->rowCount());
}
}
现在我的问题是:我认为这不是一个好方法,而声明是私有财产。在第二次测试中,我只能测试rowCount方法,但我使用了私有财产,我认为它会使将来的维护变得如此困难。哪一个是正确的?我应该以另一种方式对其进行测试吗?
解决方案
您可以使用@depends
which 允许您显式声明测试之间的依赖关系:
class DatabaseTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
*/
public function yourQueryTest()
{
// ...
}
/**
* @test
* @depends yourQueryTest
*/
public function rowCountReturnsCorrectNumber()
{
// ...
}
}
yourQueryTest
的测试在哪里\MyProject\Database\Database#query
。
推荐阅读
- java - 在java中使用 compareTo() 方法比较大小写
- vba - 如何使用单元格值作为收件人发送带有模板的电子邮件?
- docker - MariaDB galera 集群 10.2 第二个节点“无法打开通道”
- node.js - 如何使用 Node JS / Webdriver.io / Chimp 打印到 PDF?
- neo4j - Neo4j中传入节点的最大关系数?
- c++ - 函数调用后指针变化
- encryption - 是否可以将 openssl 移植到 Linux 驱动程序中?
- elasticsearch - elasticsearch - 按百分位过滤
- javascript - 内爆:数组中的参数无效?
- php - 对于 Iframe 执行速度更快 - 传递 ArrayList 或单个数据库查询