如何在两个模型之间的关系中通过phpunit成功执行测试?

时间:2019-05-31 22:36:29

标签: laravel phpunit laravel-5.7 phpunit-testing laravel-testing

我是Laravel新手。我有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 :(得分:0)

这取决于应测试的功能。

检查模型关系的基本测试是否正确设置?

我将工作示例推送到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) {
    return [
        'name' => $faker->name,
        'price' => $faker->numberBetween($min = 100, $max = 900),
        'description' => $faker->text,
    ];
});

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

生产工厂

<?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)->state('seed')->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);
    }
}

希望这是进行进一步测试的一个很好的起点。

答案 1 :(得分:0)

模型制作

      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'没有默认值