Laravel, phpunit: цикл не сохраняет более одной записи в базе данных - PullRequest
0 голосов
/ 23 сентября 2019

Я занимаюсь разработкой приложения с использованием Laravel, Eloquent как ORM, phpunit для модульного тестирования.Я хочу сохранить более одной записи в базе данных, я пытался за цикл.Но цикл for сохраняет только одну запись, даже цикл выполняется только один раз.Цикл работает нормально для другого кода, кроме фрагмента сохранения.Ниже приведены мои коды:

Класс модели:

class Post extends Model
{
    protected $table = "posts";

    protected $fillable = [
            'id', 
            'user_id', 
            'title',
            'description',
            'total_needed',
            'total_collected', 
            'total_expanse',
            'start_date',
            'end_date',
            'active',
            'updated_at',
            'created_at',
        ];

}

Код модульного тестирования

class RepoPost extends TestCase
{
public function testMain()
    {
        echo "\n >----------- Test Name : " . get_class($this);
        echo "\n >----------- Test Main : ---------> \n";
        $this->postSave();
    } //test:main


public function postSave()
    {
        $postDummy = new Post();
        // $postDummy->id ='';
        $postDummy->user_id = 'Tst';
        $postDummy->title = 'Post Save Repo Test.';
        $postDummy->description = 'UnitTesting of URLs';
        $postDummy->total_needed = '2000';
        $postDummy->total_collected = '1000';
        $postDummy->total_expanse = '500';
        $postDummy->start_date = '22-09-2019';
        $postDummy->end_date = '22-10-2019';
        $postDummy->active = '1';
        $postDummy->updated_at = '2019-09-22';
        $postDummy->created_at = '2019-09-23';

        //loop 1
        for ($x = 0; $x < 10; $x++) {
             echo '\n----PostSave----\n' . $x;
             $postRepoSave = $this->getRepoPostImpl();
             dd($postRepoSave->save2($postDummy));
         }

         //loop 2
        for ($x = 0; $x <= 10; $x++) {
            echo "\n The number is:" .  $x;
        }
    }


public function getRepoPostImpl()
    {
        return new Post_Repo_Impl;
    }


}

Петля 1 - этосохраняя только одни данные, цикл также выполняется один раз.Петля 2 работает хорошо, печатает 10 строк.

Если я копирую один и тот же метод несколько раз в "testMain ()", он сохраняет более одной записи столько раз, сколько раз я скопировал метод.Приведенный ниже код сохранит 3 записи в базе данных.

    public function testMain()
        {
            echo "\n >----------- Test Name : " . get_class($
            $this->postSave();
            $this->postSave();
            $this->postSave();
        } //test:main

Использование цикла в testMain () также даст тот же результат, сохранив одну запись.

public function testMain()
    {
        echo "\n >----------- Test Name : " . get_class($this);
        for ($x = 0; $x < 10; $x++) {
            $this->postSave();
        }
    } //test:main

Код репозитория:

class Post_Repo_Impl implements Post_Repo_I
{
    public function save2(Post $post)
    {
        $saveStatus = true;
        try {
            $post->save();
        } catch (Exception $e) {
            $saveStatus = false;
            error_log("Saveing Post Failed. : " . $e);
        }
        return $saveStatus;
    }
}

Почему я не могу сохранить несколько записей в цикле for, есть ли способ сделать это?

Обновление: создан экземпляр "сообщение объекта "внутри цикла, не решает проблему.

for ($x = 0; $x < 10; $x++) {
            $postDummy = new Post();
            // $postDummy->id ='';
            $postDummy->user_id = 'Tst';
            $postDummy->title = 'Post Save Repo Test.';
            $postDummy->description = 'UnitTesting of URLs';
            $postDummy->total_needed = '2000';
            $postDummy->total_collected = '1000';
            $postDummy->total_expanse = '500';
            $postDummy->start_date = '22-09-2019';
            $postDummy->end_date = '22-10-2019';
            $postDummy->active = '1';
            $postDummy->updated_at = '2019-09-22';
            $postDummy->created_at = '2019-09-22';

            echo '\n----PostSave----\n' . $x;
            $postRepoSave = $this->getRepoPostImpl();
            dd($postRepoSave->save2($postDummy));

        }

1 Ответ

1 голос
/ 23 сентября 2019

Переместите экземпляр Model в цикл for и очистите ваш тест, он вызывает внешний класс, реализующий интерфейс без цели

<?php

namespace Tests\Feature;

use App\Post;
use Tests\TestCase;

class RepoPostTest extends TestCase
{
    /** @test */
    public function testMain()
    {
        echo "\n >----------- Test Name : " . get_class($this);
        echo "\n >----------- Test Main : ---------> \n";
        for ($x = 0; $x < 10; $x++) {
            echo '\n----PostSave----\n' . $x;
            $this->postSave();
        }
        $this->assertCount(10, Post::whereTime('created_at', now())->get());
    }

    public function postSave()
    {
        $postDummy = new Post();
        $postDummy->user_id = 'Tst';
        $postDummy->title = 'Post Save Repo Test.';
        $postDummy->description = 'UnitTesting of URLs';
        $postDummy->total_needed = '2000';
        $postDummy->total_collected = '1000';
        $postDummy->total_expanse = '500';
        $postDummy->start_date = '22-09-2019';
        $postDummy->end_date = '22-10-2019';
        $postDummy->active = '1';
        $postDummy->save();
    }
}

Предполагая posts миграцию, подобную этой

Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('user_id');
    $table->string('title');
    $table->string('description');
    $table->string('total_needed');
    $table->string('total_collected');
    $table->string('total_expanse');
    $table->string('start_date');
    $table->string('end_date');
    $table->string('active');
    $table->timestamps();
});

И вам не нужно свойство $table в вашей модели, потому что оно имеет форму множественного числа, поэтому оно автоматически разрешается, и вам не нужно свойство $fillable, потому что вы не выполняете массовое назначение

Результаты

PHPUnit 8.3.4 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)
 >----------- Test Name : Tests\Feature\RepoPostTest
 >----------- Test Main : ---------> 
\n----PostSave----\n0\n----PostSave----\n1\n----PostSave----\n2\n----PostSave----\n3\n----PostSave----\n4\n----PostSave----\n5\n----PostSave----\n6\n----PostSave----\n7\n----PostSave----\n8\n----PostSave----\n9

Time: 263 ms, Memory: 20.00 MB

OK (1 tests, 1 assertions)
...