Как успешно выполнить тест через phpunit в отношениях между двумя моделями? - PullRequest
0 голосов
/ 01 июня 2019

Я новичок в Ларавеле.У меня есть 2 таблицы Productions и Products.Также у меня есть 2 фабрики ProductionFactory и ProductFactory.Я хочу проверить их через phpunit.Их соединение осуществляется через production_id.

Ошибка: ErrorException: неопределенная переменная: производство.

Я не понимаю.

Заранее спасибо.

Это код.

ProductionFactory.php

        $factory->define(App\Production::class, function (Faker $faker) {
        return [
                'name' =>$faker->name,
            ];
          });

ProductFactory.php

       $factory->define(App\Product::class, function (Faker $faker) {
        $production_id = App\Production::pluck('id');

       if(!$production_id->isEmpty()){
          $production = $production_id->random();
       }

    return [
             'id' =>$faker->uuid,
             'name' =>$faker->name,
             'price' => $faker->numberBetween($min = 100, $max = 900),
             'description' =>Str::random(10),
             'production_id'=> $production,
          ];

ProductionTest.php

           class ProductionTest extends TestCase
            {
              use RefreshDatabase;

             /**
             * A basic unit test example.
             * @test
             * @return void
               */
            public function production()
               {
                   factory(Production::class)->make();
                   $this->assertTrue(true);
               }
           }

ProductTest.php

           class ProductTest extends TestCase
            {
              use RefreshDatabase;

             /**
             * A basic unit test example.
             * @test
             * @return void
               */
            public function product()
               {
                   factory(Product::class)->make();
                   $this->assertTrue(true);
               }
           }

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Модельное производство

      use Illuminate\Database\Eloquent\SoftDeletes;

       class Production extends Model
       {
            use SoftDeletes;
              protected $fillable = [
                 'name',
              ];
             public function products()
               {
              return $this->hasMany('App\Product');

               }

Модель товара

      class Product extends Model
          {

              use SoftDeletes;
               protected $fillable = [
              'id','name','price','description','production_id'
               ];
           public function production()
          {
             return $this->belongsTo('App\Production');
            }

SQLSTATE [HY000]: общая ошибка: 1364 Поле 'production_id' не имеет значения по умолчанию

0 голосов
/ 01 июня 2019

Зависит от того, какие функции следует тестировать.

Базовый тест для проверки правильности отношения модели установлен?

Я переместил рабочую демонстрацию в GitHub (https://github.com/.../laravel-basic-relationship-tests).

App / Product.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    public function production()
    {
        return $this->belongsTo(Production::class);
    }
}

App / Production.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Production extends Model
{
    public function products()
    {
        return $this->belongsTo(Product::class);
    }
}

Фабрика продуктов

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Product as Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    $production = factory(\App\Production::class)->make();
    $production->save();

    return [
        'name' => $faker->name,
        'price' => $faker->numberBetween($min = 100, $max = 900),
        'description' => $faker->text,
        'production_id' => $production->id
    ];
});

Производственный завод

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Production as Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    return [
        'name' => $faker->name
    ];
});

$factory->afterCreatingState(Model::class, 'seed', function ($production, $faker) {
    $product = factory(\App\Product::class)->make();
    $production->products()->associate($product);
});

Испытание продукции

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProductTest extends TestCase
{
    /**
     * @return void
     */
    public function testProductHasWorkingProductionRelationship()
    {
        $product = factory(\App\Product::class)->create();
        $this->assertNotEmpty($product->production);
    }
}

Производственное испытание

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProductionTest extends TestCase
{
    /**
     * @return void
     */
    public function testProductionHasWorkingProductRelationship()
    {
        $production = factory(\App\Production::class)->state('seed')->create();
        $this->assertNotEmpty($production->products);
    }
}

Надеюсь, это отличная отправная точка для любых дальнейших испытаний.

...