首页 > 解决方案 > 工厂创建的对象有错误的值

问题描述

我正在使用工厂在 laravel (phpunit) 测试方法中创建一些对象:

  /** @test */
  public function private_entities_only_viewable_by_creators()
  {
    $private_entity = Entity::factory()->raw(["public" => false, "label" => "somerandomlabel"]);
    $public_entity = Entity::factory()->raw(["public" => true]);
    //echo var_dump($private_entity);
      $current_user = User::factory()->create();
      $this->withoutExceptionHandling();
      $this->followingRedirects();
      $this->actingAs($current_user)
           ->post('/entities', $private_entity)
           ->assertSee($private_entity['label']);
      $other_user = User::factory()->create();
      $this->actingAs($other_user)
           ->get('/entities')->assertDontSee($private_entity['label']);
    }

    }

我试图确保用户看不到其他用户创建的私有实体。上面使用了以下两个控制器:

  public function index(){

    $public_entities = Entity::where('public', true)->get()->toArray();
    $all_entities = Entity::all()->toArray();
    echo var_dump($all_entities);  // I expect at least one of these entities to have false for public
    $private_entities = Entity::where('public', false)->where('user_id', Auth::id())->get()->toArray();
    //echo var_dump($private_entities);
    //echo var_dump($public_entities);
    $users = User::all()->toArray();
    $entity_user_list = array_map(array($this, 'map_user'), array_merge($public_entities, $private_entities));
    return view('entities.index', ['entity_users' => $entity_user_list, 'entities' => $private_entities]);

  }

  public function create(Request $request)
  {
    $data = request()->validate([
      'label' => 'required'
    ]);
    Entity::create([
      'label' => $request['label'],
      'user_id' => Auth::id()
    ]);
    return redirect('/entities');
  }

$all_entities我在index控制器中呼应了 的值。通过工厂创建了一个public设置为falselabel设置为的实体somerandomlabel后,我希望该实体使用这些值保存在数据库中。但我$private_entities的出现是空的。index控制器记录以下内容:

array(1) {
  [0]=>
  array(6) {
    ["id"]=>
    int(2)
    ["created_at"]=>
    string(27) "2021-02-05T13:30:45.000000Z"
    ["updated_at"]=>
    string(27) "2021-02-05T13:30:45.000000Z"
    ["label"]=>
    string(15) "somerandomlabel"
    ["public"]=>
    bool(true)
    ["user_id"]=>
    int(20)
  }
}

为什么会public设置在true这里?我在工厂创建中将该值指定为 false。

标签: phpmysqllaravelphpunit

解决方案


推荐阅读