为了账号安全,请及时绑定邮箱和手机立即绑定

PHPUnit 测试依赖于另一种方法的方法

PHPUnit 测试依赖于另一种方法的方法

PHP
牧羊人nacy 2022-08-19 10:11:35
这是我的数据库类,我想测试返回正确值的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方法,但如您所见,我还使用查询方法来运行查询: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方法,除了我使用了私有财产之外,我什么都没有,我认为它会使将来的维护变得如此困难。哪一个是正确的?我应该用另一种方式测试它吗?
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您可以使用@depends它允许您显式声明测试之间的依赖关系:


class DatabaseTest extends \PHPUnit\Framework\TestCase

{

  /**

   * @test

   */

  public function yourQueryTest()

  {

    // ...

  }



  /**

   * @test

   * @depends yourQueryTest

   */

  public function rowCountReturnsCorrectNumber()

  {

    // ...

  }

}

其中 是 的测试。yourQueryTest\MyProject\Database\Database#query


查看完整回答
反对 回复 2022-08-19
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信