通过单元测试验证配置文件?

时间:2018-05-18 14:11:53

标签: php laravel unit-testing testing

我正在构建一个应用程序,用户可以在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())循环并验证配置文件的项目,但我不确定它是否属于单元测试。我觉得这只需要在提交代码或其他内容时进行一次验证。

我的问题:如何/在何时/何时检查我的配置文件在部署到生产之前是否有效?

1 个答案:

答案 0 :(得分:1)

代码与应用程序配置协作,就像它与服务,数据库,系统调用等协作一样。在单元测试中,您假定与协作者隔离测试代码,这意味着更改配置不应影响任何单元测试。

因此,要在配置不正确时断言失败,您需要转向集成测试 - 因为集成测试会处理协作者。您使用的集成测试取决于您实施配置完整性检查的位置。

例如,有些项目将配置检查放在前端控制器的最前面,这样如果任何配置是伪造的,则会立即出现异常。如果这是您的配置验证所在的位置,那么您将拥有以下内容:

/**
 * @expectedException ApplicationException
 * @expectedExceptionCode 500
 */
function test_front_controller_explodes_with_500_error_when_booted_with_bad_configuration() {
    $this->fail('unimplemented');
}