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方法,但是如您所见,我还使用了查询方法来运行查询:

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它允许您明确声明测试之间的依赖关系:

class DatabaseTest extends \PHPUnit\Framework\TestCase
{
  /**
   * @test
   */
  public function yourQueryTest()
  {
    // ...
  }


  /**
   * @test
   * @depends yourQueryTest
   */
  public function rowCountReturnsCorrectNumber()
  {
    // ...
  }
}

在哪里yourQueryTest测试\MyProject\Database\Database#query

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使一个Maven模块依赖于另一个?

SBT-如何使InputTask依赖于一个任务而最终依赖于另一个任务

当一个承诺依赖于另一个时,Bluebird的Promise.all()方法

创建一个依赖于另一个Pod的Pod

测试一个对象是否依赖于另一个对象

如何编写依赖于另一个定义文件的打字稿定义文件

Python:如何从依赖于模块的另一个文件中正确导入函数

如何测试依赖于另一个服务(又依赖于Http服务)的服务/组件?

一个按钮依赖于另一个被单击

Rxjs:将两个流与一个依赖于另一个的流合并

编译依赖于另一个扩展的VS Code扩展时出错

依赖于另一个列表框的用户窗体列表框

单元测试Angular服务,该服务依赖于另一个使用InjectionToken的服务

两个异步任务-一个依赖于python中的另一个

React-提取和显示依赖于另一个提取的数据

使下拉列表依赖于MVC Core中的另一个下拉列表

类型属性依赖于另一个属性的返回类型

一个CSS类依赖于另一个

构造对象,其属性之一依赖于另一个。在C ++中

在cmake中,如何使一个目标依赖于另一个目标?

当一个依赖于另一个的内容时渲染2个元素

从依赖于另一个jar的jar加载类

WPF 按钮位置依赖于另一个元素

如何向后移植依赖于仅存在于测试中的另一个包的包?

Django:一个modelChoiceField 依赖于另一个modelChoiceField

在实例/对象中运行一个方法,该方法的名称依赖于来自另一个实例方法的输入

在一个表中创建首先依赖于另一个表的输出的记录的有效方法是什么?

如何使用 Kotlin/native 生成依赖于另一个的 .framework?

React Native 测试组件依赖于另一个组件