【问题标题】:How to propagate setUp and tearDown across all tests in phpUnit?如何在phpUnit中的所有测试中传播setUp和tearDown?
【发布时间】:2013-01-25 01:11:58
【问题描述】:

我有以下测试/文件夹:

测试/ ClassOne.test.php ClassTwo.test.php ClassThree.test.php

我必须将以下 setUp()tearDown() 方法复制到每个文件中:

公共函数设置() { $this->dbTestData(); } 公共函数拆解() { $this->dbClear(); } 私有函数 dbTestData() { // 用一些条目填充数据库 实体\AutocompleteValue::create(array('field_name' => 'testing1', 'entry_value' => 'Aisforapple')); 实体\AutocompleteValue::create(array('field_name' => 'testing2', 'entry_value' => 'Bisforball')); 实体\AutocompleteValue::create(array('field_name' => 'testing3', 'entry_value' => 'Cisforcat')); 实体\AutocompleteValue::create(array('field_name' => 'testing4', 'entry_value' => 'Disfordog')); } 私有函数 dbClear() { DB::table('autocomplete_values')->delete(); }

我考虑编写一个单独的类,其中包含这些方法,require() 每个测试文件中的那个文件,并从 那个 类而不是 PHPUnit_Framework_Testcase 扩展。有没有更简单的解决方案?

我无法轻松访问phpunit.xml,因为我的编码框架的 CLI 工具(Laravel,artisan)处理了它的创建。因此,如果有不涉及该文件的解决方案会更好。

【问题讨论】:

  • 编写一个基础测试类并从中扩展是最好的方法,这怎么不容易?
  • 我不喜欢我必须在每个测试文件中写一个'require'语句。我想使用自动加载,但我的框架不允许这样做。所以看起来我不得不在所有测试文件中复制至少一行。
  • 拥有一个基础测试类是很常见的做法。如果您想采用更简洁(但更难)的方式,您最终可以考虑使用组合。
  • 你总是可以使用自动加载,我想不出任何方法来禁止它。您可以堆叠自动加载器,因此如果 Laravel 和 PHPUnit 的自动加载器不为您服务,并且您无法修改 PHPUnit 引导文件,您仍然可以在测试套件中添加自己的自动加载器。
  • Ocramius,你认为你可以提供一段与 laravel 兼容的代码来帮助我进行合成吗?具体来说,如果没有我在文件开头编写 some 类型的初始化(Bundle::start('name') 或其他东西,在文件的开头(这将启动自动加载器),Laravel 就不会启动。这不是与必须使用 require 语句有很大不同。我希望完全消除这种重复。

标签: phpunit


【解决方案1】:

放弃并创建基类。这是这种情况下的标准解决方案。它还带来了其他优势,例如保存您创建的 static 断言扩展的好地方。

我什至都在努力想出一种替代方法,更不用说一种更简单的方法了。我只能建议使用一个脚本来扫描每个测试文件并插入setUptearDown 及其依赖项(如果找不到它们)。但是(恕我直言)这是一个更复杂的解决方案,没有显着的好处。

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多