【问题标题】:PHPUnit: Problem with testing databasePHPUnit:测试数据库的问题
【发布时间】:2011-04-27 08:29:48
【问题描述】:

我是使用 PhpUnit 进行数据库测试的新手。我从简单的测试开始,将 PostgreSQL 表的内容与 xml 文件进行比较。

问题是断言没有按预期工作:

请看一下结果:

http://www3.picturepush.com/photo/a/5540556/1024/Anonymous/Screenshot.png

如您所见,表是相等的,但 db 表中的内容(首先在屏幕上)有一个额外的空格...

我不知道出了什么问题。

这是 PHP 代码:

public function testGetSourceData()
{
    include_once(
            sfConfig::get('sf_lib_dir')
            . '/task/ShopCategoryTreeUpdateTask.class.php'
    );

    $method = new ReflectionMethod(
      'ShopCategoryTreeUpdateTask', '_getSourceData'
    );

    $method->setAccessible(TRUE);

    $res = $method->invoke(new ShopCategoryTreeUpdateTask(new sfEventDispatcher, new sfFormatter),123);

    $actual = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection());
    $actual->addTable('shop');

    $expected = $this->getDataSet();

    $this->assertDataSetsEqual(
        $actual,
        $expected
    );

}

这里是 XML: http://pastebin.com/5MmtJDr6

感谢您的任何目标!

【问题讨论】:

  • 票已重新编辑,我已添加代码。请重新打开这个问题。感谢您提供有关 SO 的帮助和目标。
  • char 列(而不是 varchar)是否会搞砸?

标签: php postgresql phpunit


【解决方案1】:

我认为您可能过于复杂了测试。在您的方法中,QueryDataSet 和 getDataSet 可能会将结果呈现为不同的字符串。

您不应该真正通过反射来测试私有和公共方法,因为这些应该可以通过您的公共方法进行测试和访问。如果它们不能被公共方法访问,那么它们就永远不能被调用。您的代码覆盖率报告在这里派上用场。

【讨论】:

  • 嗨,恕我直言,测试私有和受保护方法都是正确的:sebastian-bergmann.de/archives/881-Testing-Your-Privates.html 您的建议的结果将是良好的代码覆盖率,但不是真正的单元测试。另一件事是我已经回答了数据库测试的问题,而不是测试私有或受保护方法的意义/问题。汤姆
  • 实际上,如果您阅读底部附近的段落,他解释了他对测试私有/受保护方法和属性的立场“大多数时候,您应该能够通过执行其公共方法来测试一个类.如果有重要的功能隐藏在私有或受保护的访问之后,那可能是一个警告信号,表明那里有另一个类正在努力摆脱”和......“所以:仅仅因为测试受保护和私有属性和方法有可能并不意味着这是一件“好事”。”
猜你喜欢
  • 2015-03-15
  • 2013-08-09
  • 2011-05-08
  • 2014-11-21
  • 2019-04-21
  • 2017-09-25
  • 2019-11-22
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多