Laravel 5.8测试设置记录从数据库

时间:2019-07-26 06:20:47

标签: php laravel unit-testing

我刚开始编写测试,我想知道我在这里做的事是否正确。

基本上我想写一个测试来检查设置是否正确,但是我直接使用数据库中的记录。

一切正常,但是我想知道我的数据库为空怎么办?此测试将永远无法进行

那这里的最佳实践是什么?

我的测试:

/** @test */
public function settings_for_ftp_flysytem_is_correct_test()
{
    $clientSettings = Client::where('category', 'ftp')->first()->settings()->get();

    $this->assertArrayHasKey('host', $clientSettings);
    $this->assertArrayHasKey('username', $clientSettings);
    $this->assertArrayHasKey('password', $clientSettings);
    $this->assertArrayHasKey('port', $clientSettings);
    $this->assertArrayHasKey('root', $clientSettings);
}

1 个答案:

答案 0 :(得分:0)

我认为最简单的解决方案是使用DatabaseTransactions特性和model factories。为每个测试用例生成测试数据总是一个好主意。

<?php
// ClientFactory.php

use Faker\Generator;

$factory::define(App\Setting::class, function (Generator $faker) {
    return [...];
});
<?php
// SettingFactory.php

use Faker\Generator;

$factory::define(App\Setting::class, function (Generator $faker) {
    return [...];
});
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseTransactions;

use App\Client;
use App\Setting;

class SettingsTest extends TestCase
{
    use DatabaseTransactions;

    public function test_client_has_settings()
    {
        // 1. Arrange.
        $client = factory(Client::class)->create();
        $settings = factory(Setting::class, 2)->create();
        $client->settings()->saveMany($settings);

        // 2. Act.
        $response = $this->getJson("/clients/{$client->id}/settings");

        // 3. Assert.
        $response->assertJson([...]);
    }
}

上面的代码是一个示例。有关更多信息,请检查以下资源:Laravel DocsBuild a Forum with LaravelTest-Driven Laravel

相关问题