Как проверить функцию, которая получает данные из БД в пакете Laravel 5? - PullRequest
0 голосов
/ 17 марта 2019

Я работаю над пакетом Laravel 5 и пишу тесты. Я пытаюсь протестировать функцию, которая получает данные из БД.

public function getPhotoDatasFromDb()
{
    $ret = GalleryImage::get()->keyBy('file_name');
    return $ret;
}

Возвращаемые значения должны быть в следующем формате:

Collection {#416 ▼
  #items: array:2 [▼
    "IMG_1979.jpg" => GalleryImage {#423 ▼}
        "alt_text" => "example alt text"
        "description" => "lorem ipsum"
    "IMG_1980.jpg" => GalleryImage {#424 ▶}
  ]
}

У меня уже был опыт тестирования базы данных в других приложениях Laravel.

Мой вопрос: , поскольку я пишу пакет, а в среде разработчика у меня нет экземпляра БД, мне интересно, каков наилучший подход для его тестирования?

Если может помочь получить более широкую картину, таблица базы данных создается в приложении через эту миграцию:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateGalleryImagesTable extends Migration
{
    public function up()
    {
        Schema::create('gallery_images', function (Blueprint $table) {
            $table->increments('id');
            $table->string('file_name')->unique();
            $table->text('description')->nullable();
            $table->string('alt')->nullable();
            $table->string('video_link')->nullable();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('gallery_images');
    }
}

А это модель связанная

<?php

namespace DavideCasiraghi\ResponsiveGallery;

use Illuminate\Database\Eloquent\Model;

class GalleryImage extends Model
{
    protected $fillable = [
        'file_name', 'description', 'alt', 'video_link',
    ];
}

1 Ответ

0 голосов
/ 20 марта 2019

Я нашел решение сам.Я публикую его на тот случай, если это может быть полезно для кого-то другого.

Это мой тест:

    /** @test */
    public function it_gets_photos_from_db()
    {
        $gallery = new ResponsiveGalleryFactory();
        $dbImageDatas = $gallery->getPhotoDatasFromDb();
        $this->assertStringContainsString($dbImageDatas['DSC_9470.jpg']->description, 'Photo description');
    }

Чтобы это работало, мне пришлось настроить БД в начале класса тестирования:

    /**
     * Create the tables this model needs for testing.
     */
    public static function setUpBeforeClass() : void
    {
        $capsule = new Capsule;

        $capsule->addConnection([
            'driver' => 'sqlite',
            'database' => ':memory:',
            'prefix' => '',
        ]);

        $capsule->setAsGlobal();
        $capsule->bootEloquent();

        Capsule::schema()->create('gallery_images', function (Blueprint $table) {
            $table->increments('id');
            $table->string('file_name')->unique();
            $table->text('description')->nullable();
            $table->string('alt')->nullable();
            $table->string('video_link')->nullable();
            $table->timestamps();
        });

        Model::unguard();

        GalleryImage::create([
            'file_name' => 'DSC_9470.jpg',
            'description' => 'Photo description',
            'alt_text' => 'Photo alt text',
            'video_link' => 'https://www.youtube.com/fsda234',
        ]);
    } 
...