【问题标题】:phpunit - reusing mock objects for multiple test suitesphpunit - 为多个测试套件重用模拟对象
【发布时间】:2011-05-19 06:54:12
【问题描述】:

我很好奇其他人是如何处理这个问题的。写一个测试并没有那么糟糕,但嘲笑有点糟糕,会打断我的心流。是否可以拥有一个“fixtures”目录并说 mock_db.php 仅具有特定的模拟声明?

更进一步,将这些模拟抽象到一个函数中会是一种不好的做法吗?

即:

 // function to include a db mock
   include_once 'test/fixtures/dbmock.php';

   $mockMYSQL = $dbmock('mysql', 'db1');
   $mockMSSQL = $dbmock('mssql', 'db2');

只是想知道其他有经验的测试人员如何处理这个问题。我正在编写脚本来同步 2 个数据库,因此这个示例可能会变得非常相关。

【问题讨论】:

  • 数据提供者不帮助你吗?
  • 您是在谈论使用$this->getMock('<class>') 创建的 PHPUnit 模拟对象还是这些自定义编写的模拟?使用夹具来创建测试支持对象是完全有效和推荐的。
  • @David 我希望模拟可重用于不同的测试套件。这种嘲弄的业务仍然很绿,对如何实现这一点一无所知。

标签: php unit-testing phpunit


【解决方案1】:

我会选择继承——在公共父测试用例类的受保护的 get* 方法中创建和返回公共模拟对象。

或者,您可以创建更简洁且独立的类,您将在测试套件中对其进行实例化,并让它创建您的模拟对象。我更喜欢这种方式,但它有一个缺点 - 您可能不能或不应该使用 PHPUnit_Framework_TestCase getMock() 方法。我建议你看看这个方法并尝试在你的独立类中使用它的逻辑。

包含全局函数不是很 OOP,PHP 允许它相当神奇,但你应该避免它:)

【讨论】:

  • 嘿,感谢您的提示,小班测试用例中的子类化是我缺少的部分。根据您的建议,我已经创建了几个独立的,但我仍然需要寻找一种方法来重用 getMock() 创建者。
  • 8 年后... 谁能举例说明如何做到这一点? :)
  • Subclassing TestCase 有一些关于 $this 上下文的问题,它不会引用与 PHPUnit 为当前运行的测试用例自动创建的实例相同的实例。这将导致 PHPUnit 不知道您对模拟对象设置的期望,因为重用模拟创建逻辑的代码将有自己的$this。在这种情况下,您将需要传递扩展 TestCase 的类的 $this 实例,该实例具有可重用的模拟创建逻辑并使用此 $this,或者使用 PHP 特征并将您的可重用逻辑放在特征中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2010-09-23
  • 2012-12-18
  • 2011-12-06
  • 2011-01-28
  • 2012-05-05
相关资源
最近更新 更多