【发布时间】:2018-05-18 14:11:53
【问题描述】:
我正在构建一个应用程序,用户可以在其中选择config/timezones.php 中定义的时区之一:
return [
'malta' => 'Europe/Malta',
'manila' => 'Asia/Manila',
'newyork' => 'America/New_York',
];
此文件有一个数组,其中包含一个标识符和一个有效的时区字符串(如 on PHP.net 所示)
我正在尝试基于测试驱动开发来构建这个应用程序,所以我很自然地编写了一个单元测试来检查用户更改时区时时间是否正确更改:
namespace Tests\Unit;
use Carbon\Carbon;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class TimeZoneTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function the_date_and_time_will_be_displayed_based_on_the_timezone_of_the_user() {
$user = factory(\App\User::class)->create([
'timezone' => 'Asia/Manila' // +8 hours
]);
$date = Carbon::create(2018, 1, 1, 0, 0, 0); // 2018-01-01 00:00:00
$adjustedDate = $date->timezone($user->timezone)->format('Y-m-d H:i:s'); // +8 hours = 2018-01-01 08:00:00
$this->assertEquals('2018-01-01 08:00:00', $adjustedDate);
}
}
这很好用,但问题是:如果我在配置文件中打错字,单元测试仍然会通过,但应用程序会中断。
我可以简单地创建另一个单元测试,在其中循环并使用in_array($timezone, timezone_identifiers_list()) 验证我的配置文件中的项目,但我不确定它是否属于单元测试。在我看来,这只需要在提交代码或其他内容时验证一次。
我的问题:我如何/在哪里/何时检查我的配置文件在部署到生产之前是否有效?
【问题讨论】:
-
尝试在测试中循环遍历它并根据这些值创建一个日期时区对象。如果可行,$x 将是该类的一个实例
-
配置不应通过单元测试进行测试。所以单元测试仍然有效是一件好事。您不希望更改配置来中断测试运行。损坏/错误的配置将导致错误的输出,虽然测试驱动的开发很好,但不要以 100% 的覆盖率为目标。如果您真的想确保您的应用程序正常工作,您需要添加功能测试。
-
旁注:
$adjustedDate应该是 User 类或服务的一部分。您正在编写要测试的逻辑,即:$date->timezone($user->timezone)->format('Y-m-d H:i:s');在测试用例中。您必须在要使用它的每一段代码中重复该行。将timezone设为私有而不是公共属性,并在用户上引入getFormattedDate()方法,然后使用时区生成该字符串。
标签: php laravel unit-testing testing