php - PHPUnit 中的模拟对象来模拟静态方法调用?

标签 php static mocking phpunit

我正在尝试测试一个管理数据库中数据访问的类(您知道,本质上是 CRUD)。我们正在使用的 DB 库恰好有一个 API,您首先通过静态调用获取表对象:

function getFoo($id) {
  $MyTableRepresentation = DB_DataObject::factory("mytable");
  $MyTableRepresentation->get($id);
  ... do some stuff
  return $somedata
}

...你明白了。

我们正在尝试测试此方法,但模拟了 DataObject 的东西,以便 (a) 我们不需要实际的数据库连接来进行测试,并且 (b) 我们甚至不需要包含 DB_DataObject 库用于测试。

但是,在 PHPUnit 中,我似乎无法让 $this->getMock() 适本地设置静态调用。我有...

        $DB_DataObject = $this->getMock('DB_DataObject', array('factory'));

...但测试仍然显示未知方法“工厂”。我知道它正在创建对象,因为之前它说找不到 DB_DataObject。现在可以了。但是,没有办法吗?

我真正想要做的是拥有两个模拟对象,一个也用于返回的表对象。因此,我不仅需要指定工厂是静态调用,还需要指定它返回我已经设置的一些指定的其他模拟对象。

我应该提一下,我之前在 SimpleTest 中做过这个(找不到代码)并且它运行良好。

什么给了?

[更新]

我开始明白它与 expects() 有关

最佳答案

我同意你们两个的观点,最好不要使用静态调用。但是,我想我忘了提到 DB_DataObject 是第三方库,静态调用是他们代码使用的最佳实践,而不是我们的。还有其他方法可以使用它们的对象,这些方法涉及直接构造返回的对象。它只是将那些该死的 include/require 语句留在使用该 DB_DO 类的任何类文件中。这很糟糕,因为如果您同时尝试在测试中模拟一个同名的类,测试将会中断(或者只是不会被隔离)——至少我认为是这样。

关于php - PHPUnit 中的模拟对象来模拟静态方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/344315/

相关文章:

javascript - 如何通过 PHP 使用 onclick() 方法打印 html 代码?

java - Java 中局部变量如何在其方法之外访问?

c++ - 静态结构链接器错误

unit-testing - PHPUnit:模拟不存在的类

unit-testing - 模拟命名导出以使用 Jest 进行测试

php - 通过 jQuery 更改复选框的值

php - Paypal cURL 请求 - ERRORCODE0=81002

php - 如何开发CRM系统

java - 导入或实现可重用的静态数据?

testing - 模拟和 stub 之间有什么区别?