【问题标题】:PHPUnit - PHP Fatal error: Call to a member function GetOne() on nullPHPUnit - PHP 致命错误:在 null 上调用成员函数 GetOne()
【发布时间】:2016-06-06 16:52:51
【问题描述】:

我今天开始在 PhpStorm 上使用 PHPUnit 测试。 我可以测试几乎所有的功能,除了需要数据库连接的功能。

功能:

public function getProductID()
{
     $this->product_id = $this->db->GetOne("select product_id from table1 where id = {$this->id}");
     return $this->product_id['product_id'];
}

在我的测试用例中,出现错误:

PHP 致命错误:在 null 上调用成员函数 GetOne()

我已经定义了:

global $_db;
$this->db = $_db;

【问题讨论】:

  • 可能 $_db 为空,你能检查一下吗?
  • 你能检查一下 var_dump($this->product_id); ?
  • 是的,$_db 为空。但这不是理由。我在任何地方都使用 $_db 没有问题,就在这里,@WilliamJanoti
  • $this->product_id 在我的功能上并且工作完美。问题出在我的 UnitTests 函数上,它在 $_db 上给出了 Null

标签: php unit-testing phpunit


【解决方案1】:

您应该在测试中模拟/存根您的连接,例如

$stub = $this
    ->getMockBuilder('YourDBClass') // change that value with your REAL db class
    ->getMock();

// Configure the stub.
$stub
    ->method('GetOne')
    ->willReturn(); // insert here what you expect to obtain from that call

这样你的测试是与其他依赖隔离的。

如果您想进行不同类型的测试(例如,使用 REAL DB 数据),您不应该进行单元测试,而是 functional testing or integration testing

说明

您在这里测试的是getProductID()(一种方法),它应该基本上返回一个整数。时期。这是(或应该是)测试的目的。所以你只想检查是否返回一个整数,而不是返回那个整数。如果你停下来想一想,你可能会注意到你不希望受到任何其他依赖结果的影响。

【讨论】:

  • 嗨@DonCallisto,我需要使用真实的数据库数据。在unitTest上不可能吗?对不起菜鸟问题,但我今天才开始使用它
  • @62009030 不推荐。此外,如果您的数据库没有直接传递给您的 SUT(被测系统),而是通过依赖注入进行注入,则几乎不可能使用真正的数据库连接。
  • 有什么方法可以将连接注入到 db 吗?谢谢你的解释
  • 感谢您的解释!我正在尝试使用存根,但还没有成功。 YouDBClass 应该是我的 $ths-DB 和方法 GetOne 还是函数名称? WillReturn 是我希望在这种情况下收到 int 的地方,我想对了吗?
  • @62009030 不,您应该为使用您正在测试的方法的类创建具有您期望的等价物的存根。 WillReturn 在您的情况下应该返回 GetOne 返回的内容(一个数组?)。之后,要使用存根,您应该直接或通过独立注入传入类构造函数。我建议阅读 phpunit 手册 :)
猜你喜欢
  • 2015-08-01
  • 1970-01-01
  • 2018-06-22
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多