簡體   English   中英

Laravel 5:Model-> fill()在單元測試中忽略$ fillable屬性

[英]Laravel 5: Model->fill() ignores $fillable property in unit tests

我有一個用戶控制器,其中包含以下驗證規則:

public function store(Request $request)
{
    ...
    $this->validate($request, [
        'name' => 'required',
        'email' => 'email|required|unique:users',
        'password' => 'confirmed|max:32|min:8|required',
        'roles' => 'exists:roles,id|required',
    ]);

    $user = new User();
    $user->fill($request->all());
   ...
}

我的User.php模型將可填充屬性定義為:

protected $fillable = ['name', 'email'];

要通過confirmed驗證,我必須在POST請求中發送passwordpassword_confirmation字段。

在開發過程中一切正常,但在單元測試中,我遇到了數據庫錯誤。 它嘗試將數據插入password_confirmation列。 它就像忽略了$fillable數組。

我知道“測試之間的laravel losts事件處理程序”錯誤/問題( https://github.com/laravel/framework/issues/1181 )。 所以我想也許我不想在Model::boot()之外調用一些模型函數(我在測試的setUp()函數中調用User::boot() )。

謝謝,

編輯

閱讀Model.php源代碼,我發現有人正在調用Model::unguard() https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L2180在setUp()函數之后和測試之前。 如果我在測試開始時調用User::reguard() ,但是(我不知道為什么),unguard()和reguard()函數被多次調用,測試變得非常慢。

發現問題:v5.0.x中的基本播種器只叫做Model :: unguard()( https://github.com/laravel/laravel/blob/v5.0.22/database/seeds/DatabaseSeeder.php#L15 )更新v5.1.x並添加了對Model :: reguard()的調用( https://github.com/laravel/laravel/blob/v5.1.0/database/seeds/DatabaseSeeder.php#L19)(I正在使用v5.0.22)。

可填充僅適用於MassAssignment。 當您創建新實例時,就像上面所做的那樣,您不會觸發質量分配事件。

你可以這樣做:如果你正在創建用戶,你可能會做:

$user = User::create($request->all);

如果您只想實例化用戶而不保留數據,則可以執行以下操作:

$user = new User($request);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM