Laravel Virgin: настройка и уничтожение базы данных в интеграционных тестах phpunit - PullRequest
0 голосов
/ 25 июня 2019

Используя eloquent репозиторий nilportuguess library , я создал следующий (с ошибками) репозиторий:

namespace App\Repositories;

use NilPortugues\Foundation\Infrastructure\Model\Repository\Eloquent\EloquentRepository;
use App\Model\Rover;

class RoverRepository extends EloquentRepository
{

    /**
     * {@inheritdoc}
     */
    protected function modelClassName()
    {
        return Rover::class;
    }

    /**
     * {@inheritdoc}
     */
    public function find(Identity $id, Fields $fields = null)
    {
        $eloquentModel = parent::find($id, $fields);

        return $eloquentModel->toArray();
    }

    /**
     * {@inheritdoc}
     */
    public function findBy(Filter $filter = null, Sort $sort = null, Fields $fields = null)
    {
        $eloquentModelArray = parent::findBy($filter, $sort, $fields);

        return $this->fromEloquentArray($eloquentModelArray);
    }

    /**
     * {@inheritdoc}
     */
    public function findAll(Pageable $pageable = null)
    {
        $page = parent::findAll($pageable);

        return new Page(
            $this->fromEloquentArray($page->content()),
            $page->totalElements(),
            $page->pageNumber(),
            $page->totalPages(),
            $page->sortings(),
            $page->filters(),
            $page->fields()
        );
    }

    /**
    * @param array $eloquentModelArray
    * @return array
    */
   protected function fromEloquentArray(array $eloquentModelArray) :array
   {
        $results = [];
        foreach ($eloquentModelArray as $eloquentModel) {
            //This is required to handle findAll returning array, not objects.
            $eloquentModel = (object) $eloquentModel;

            $results[] = $eloquentModel->attributesToArray();
        }

        return $results;
   }
}

И чтобы найти их, я подумал сделать интеграционный тест для sqlite inmemory db:

namespace  Test\Database\Integration\Repositories;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Repositories\RoverRepository;
use App\Model\Rover;
use App\Model\Grid;

class RoverRepositoryTest extends TestCase
{
    use RefreshDatabase;

    private $repository=null;

    public function setUp(): void
    {
        parent::setUp();
        $grid=factory(Grid::class)->create([
            'width'=>5,
            'height'=>5
        ]);
        $rover=factory(Rover::class, 5)->create([
            'grid_id' => $grid->id,
            'grid_pos_x' => rand(0, $grid->width),
            'grid_pos_y' => rand(0, $grid->height),
        ]);

        //How do I run Migrations and generate the db?

        $this->repository = new RoverRepository();
    }

    public function tearDown(): void
    {
        parent::tearDown();
        //How I truncate and destroy Database?
    }

   /**
     * Testing Base Search
     *
     * @return void
    */
    public function testBasicSearch(): void
    {
        //Some Db test
    }
}

Но у меня есть несколько вопросов:

  • Как сохранить сгенерированные с помощью заводских моделей?
  • Как я могу уничтожить мою базу данных в tearDown()?
...