gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

如何在Laravel應用程序中使用模型工廠?

如何在Laravel應用程序中使用模型工廠?下面本篇文章給大家介紹一下在測試中使用 Laravel 模型工程的方法,希望對大家有所幫助!

如何在Laravel應用程序中使用模型工廠?

Laravel 9 保姆級視頻教程,想學不會都難!進入學習

Laravel 模型工廠是你可以在應用程序中進行測試時使用的最佳功能之一。它們提供了一種定義可預測且易于復制的數據的方法,以便你的測試保持一致和可控。

讓我們從一個簡單的例子開始。我們有一個用于寫博客的應用程序,所以很自然地,我們有一個 Post 模型,該模型具有發布、起草或排隊的狀態。讓我們看一下這個例子的 Eloquent 模型:

declare(strict_types=1);  namespace AppModels;  use AppPublishingEnumsPostStatus; use IlluminateDatabaseModel;  class Post extends Model {     protected $fillable = [         'title',         'slug',         'content',         'status',         'published_at',     ];      protected $casts = [         'status' => PostStatus::class,         'published_at' => 'datetime',     ]; }
登錄后復制

正如你在此處看到的,我們有一個用于狀態列的 Enum,我們現在將對其進行設計。在這里使用枚舉允許我們利用 PHP 8.1 的特性,而不是純字符串、布爾標志或混亂的數據庫枚舉。

 declare(strict_types=1);  namespace AppPublishingEnums;  enum PostStatus: string {     case PUBLISHED = 'published';     case DRAFT = 'draft';     case QUEUED = 'queued'; }
登錄后復制

現在,讓我們回到我們在這里討論的主題:模型工廠。一個簡單的工廠看起來很簡單:

 declare(strict_types=1);  namespace DatabaseFactories;  use AppModelsPost; use AppPublishingEnumsPostStatus; use IlluminateDatabaseEloquentFactoriesFactory; use IlluminateSupportArr; use IlluminateSupportStr;  class PostFactory extends Factory {     protected $model = Post::class;      public function definition(): array     {         $title = $this->faker->sentence();         $status = Arr::random(PostStatus::cases());          return [             'title' => $title,             'slug' => Str::slug($title),             'content' => $this->faker->paragraph(),             'status' => $status->value,             'published_at' => $status === PostStatus::PUBLISHED                 ? now()                 : null,         ];     } }
登錄后復制

所以在我們的測試中,我們現在可以快速調用我們的 post factory 為我們創建一個 post。讓我們看看我們可以如何做到這一點:

 it('can update a post', function () {     $post = Post::factory()->create();      putJson(         route('api.posts.update', $post->slug),         ['content' => 'test content',     )->assertSuccessful();      expect(         $post->refresh()     )->content->toEqual('test content'); });
登錄后復制

登錄后復制

一個足夠簡單的測試,但是如果我們的業務規則規定你只能根據帖子類型更新特定列,會發生什么?讓我們重構我們的測試以確保我們可以做到這一點:

it('can update a post', function () {     $post = Post::factory()->create([         'type' => PostStatus::DRAFT->value,     ]);      putJson(         route('api.posts.update', $post->slug),         ['content' => 'test content',     )->assertSuccessful();      expect(         $post->refresh()     )->content->toEqual('test content'); });
登錄后復制

完美,我們可以將一個參數傳遞給 create 方法,以確保我們在創建它時設置正確的類型,這樣我們的業務規則就不會抱怨。但是這樣寫有點麻煩,所以讓我們稍微重構一下我們的工廠,添加修改狀態的方法:

 declare(strict_types=1);  namespace DatabaseFactories;  use AppModelsPost; use AppPublishingEnumsPostStatus; use IlluminateDatabaseEloquentFactoriesFactory; use IlluminateSupportStr;  class PostFactory extends Factory {     protected $model = Post::class;      public function definition(): array     {         $title = $this->faker->sentence();          return [             'title' => $title,             'slug' => Str::slug($title),             'content' => $this->faker->paragraph(),             'status' => PostStatus::DRAFT->value,             'published_at' => null,         ];     }      public function published(): static     {         return $this->state(             fn (array $attributes): array => [                 'status' => PostStatus::PUBLISHED->value,                 'published_at' => now(),             ],         );     } }
登錄后復制

我們為工廠設置了默認值,以便所有新創建的帖子都是草稿。然后我們添加一個設置要發布的狀態的方法,它將使用正確的 Enum 值并設置發布日期 – 在測試環境中更具可預測性和可重復性。讓我們看看我們的測試現在是什么樣子:

 it('can update a post', function () {     $post = Post::factory()->create();      putJson(         route('api.posts.update', $post->slug),         ['content' => 'test content',     )->assertSuccessful();      expect(         $post->refresh()     )->content->toEqual('test content'); });
登錄后復制

登錄后復制

回到一個簡單的測試——所以如果我們有多個測試想要創建一個草稿帖子,他們可以使用工廠。現在讓我們為發布的狀態編寫一個測試,看看是否有錯誤。

 it('returns an error when trying to update a published post', function () {     $post = Post::factory()->published()->create();      putJson(         route('api.posts.update', $post->slug),         ['content' => 'test content',     )->assertStatus(Http::UNPROCESSABLE_ENTITY());      expect(         $post->refresh()     )->content->toEqual($post->content); });
登錄后復制

這次我們正在測試當我們嘗試更新已發布的帖子時是否收到驗證錯誤狀態。這可確保我們保護我們的內容并在我們的應用程序中強制執行特定的工作流程。

那么如果我們還想確保工廠中的特定內容會發生什么呢?我們可以根據需要添加另一種方法來修改狀態:

 declare(strict_types=1);  namespace DatabaseFactories;  use AppModelsPost; use AppPublishingEnumsPostStatus; use IlluminateDatabaseEloquentFactoriesFactory; use IlluminateSupportStr;  class PostFactory extends Factory {     protected $model = Post::class;      public function definition(): array     {         return [             'title' => $title = $this->faker->sentence(),             'slug' => Str::slug($title),             'content' => $this->faker->paragraph(),             'status' => PostStatus::DRAFT->value,             'published_at' => null,         ];     }      public function published(): static     {         return $this->state(             fn (array $attributes): array => [                 'status' => PostStatus::PUBLISHED->value,                 'published_at' => now(),             ],         );     }      public function title(string $title): static     {         return $this->state(             fn (array $attributes): array => [                 'title' => $title,                 'slug' => Str::slug($title),             ],         );     } }
登錄后復制

因此,在我們的測試中,我們可以創建一個新測試,以確保我們可以通過我們的 API 更新草稿帖子標題:

 it('can update a draft posts title', function () {     $post = Post::factory()->title('test')->create();      putJson(         route('api.posts.update', $post->slug),         ['title' => 'new title',     )->assertSuccessful();      expect(         $post->refresh()     )->title->toEqual('new title')->slug->toEqual('new-title'); });
登錄后復制

所以我們可以很好地使用工廠狀態來控制我們的測試環境中的東西,給我們盡可能多的控制權。這樣做將確保我們始終如一地準備測試,或者很好地反映特定點的應用程序狀態。

如果我們需要為我們的測試創建許多模型,我們該怎么辦?我們應該怎么做?簡單的答案是告訴工廠:

it('lists all posts', function () {     Post::factory(12)->create();      getJson(         route('api.posts.index'),     )->assertOk()->assertJson(fn (AssertableJson $json) =>         $json->has(12)->etc(),     ); });
登錄后復制

所以我們正在創建 12 個新帖子,并確保當我們獲得索引路由時,我們有 12 個帖子返回。除了將 count 傳遞給工廠方法,你還可以使用 count 方法:

Post::factory()->count(12)->create();
登錄后復制

但是,在我們的應用程序中,有時我們可能希望以特定順序運行事物。假設我們希望第一個是草稿,但第二個已發布?

 it('shows the correct status for the posts', function () {     Post::factory()         ->count(2)         ->state(new Sequence(             ['status' => PostStatus::DRAFT->value],             ['status' => PostStatus::PUBLISHED->value],         ))->create();      getJson(         route('api.posts.index'),     )->assertOk()->assertJson(fn (AssertableJson $json) =>         $json->where('id', 1)             ->where('status' PostStatus::DRAFT->value)             ->etc();     )->assertJson(fn (AssertableJson $json) =>         $json->where('id', 2)             ->where('status' PostStatus::PUBLISHED->value)             ->etc();     ); });
登錄后復制

你如何在應用程序中使用模型工廠?你有沒有找到任何很酷的方法來使用它們?在 twitter 上告訴我們!

原文地址:https://laravel-news.com/laravel-model-factories

譯文地址:https://learnku.com/laravel/t/70290

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日韩视频在线观看视频| 九九热视频免费| av不卡在线免费观看| 精品一卡二卡三卡| 337p粉嫩大胆噜噜噜鲁| 福利在线一区二区| www.亚洲成人网| 老太脱裤让老头玩ⅹxxxx| 国产毛片久久久久久国产毛片| 久久精品一二三四| 男女爱爱视频网站| 免费cad大片在线观看| 久久男人资源站| 国产97在线 | 亚洲| 欧美久久久久久久久久久久久 | 狠狠干狠狠操视频| 日韩欧美国产片| 伊人色在线观看| 日本三级中文字幕在线观看| 国产一区二区三区乱码| 霍思燕三级露全乳照| 99久久激情视频| 一本色道久久亚洲综合精品蜜桃| 超碰在线超碰在线| 精品少妇人欧美激情在线观看| 欧美变态另类刺激| 蜜桃免费在线视频| 黄黄视频在线观看| 久久国产色av免费观看| 国内av免费观看| www.玖玖玖| 青青草原国产免费| 国产免费毛卡片| 最新视频 - x88av| 久久久久久久片| 国产一区二区四区| 污污视频网站在线| 日韩免费毛片视频| 亚洲精品天堂成人片av在线播放| 精品国产一区三区| 亚洲国产精品影视| 免费看污黄网站| 国产在线精品91| 亚洲色婷婷久久精品av蜜桃| 亚洲高清在线免费观看| 99视频精品全部免费看| xxww在线观看| 久久综合久久色| 欧美日韩精品在线一区二区| 欧美少妇在线观看| 三级一区二区三区| 日本男人操女人| 免费无码国产v片在线观看| 青青草免费在线视频观看| 日日噜噜夜夜狠狠| 成人黄色一区二区| 黄色片视频在线免费观看| 欧美一级爱爱视频| 青青草综合在线| 麻豆视频传媒入口| 日韩不卡一二区| 9999在线观看| 好吊色视频988gao在线观看| 中文字幕一区二区在线观看视频| 久久精品99国产| 午夜肉伦伦影院| 妞干网在线免费视频| 国产精品无码av无码| 国产精品亚洲a| 能看的毛片网站| 亚洲综合色在线观看| 国产精品区在线| 五月天开心婷婷| 亚洲免费在线播放视频| 亚洲第一成肉网| 成人在线免费高清视频| 免费看日本黄色| 国产成人在线免费看| 精品人妻一区二区三区四区在线| 搞av.com| 久久人妻精品白浆国产| 国产九九在线观看| 黄色高清视频网站| 又大又硬又爽免费视频| www.99热这里只有精品| 欧美日韩激情视频在线观看| 亚洲精品视频导航| 亚洲AV无码成人精品一区| 日韩欧美猛交xxxxx无码| 激情综合在线观看| 亚洲精品免费一区亚洲精品免费精品一区 | 亚洲综合激情视频| 热这里只有精品| 成人在线免费观看av| 手机在线免费观看毛片| 日韩视频在线观看一区二区三区| av在线免费观看国产| 男人的天堂日韩| 日本五级黄色片| 中文字幕 91| 阿v天堂2017| 欧美在线a视频| 日韩av黄色网址| 玖玖精品在线视频| 免费看a级黄色片| 97视频久久久| 2021国产视频| 日韩av.com| 日本在线视频www| 久久艹国产精品| 欧美午夜精品理论片| 97xxxxx| 国产精品久久中文字幕| 成人在线观看www| 老司机午夜性大片| 亚洲熟妇av一区二区三区漫画| 国产一级免费大片| 国产福利一区视频| 日韩在线视频在线观看| 强开小嫩苞一区二区三区网站| 亚洲色图 在线视频| 国产精品亚洲a| 日韩小视频在线播放| 蜜臀精品一区二区| 三级在线免费观看| 波多野结衣激情| 日本免费在线视频观看| 国产欧美激情视频| 亚洲午夜精品一区| 亚洲av无日韩毛片久久| 免费看污污网站| 日韩高清第一页| 91精产国品一二三产区别沈先生| 亚洲成色www.777999| 自慰无码一区二区三区| 男人操女人逼免费视频| 热99这里只有精品| 国产免费观看高清视频| 香港三级韩国三级日本三级| 欧美,日韩,国产在线| 精品99在线视频| 日本熟妇人妻中出| 中国黄色片一级| dy888午夜| 日韩在线综合网| 欧美成人黄色网址| 久热精品在线播放| 国产系列第一页| 久久这里只有精品18| 福利视频一区二区三区四区| 精品国产免费av| 91人人澡人人爽人人精品| 一道本在线免费视频| 无码人妻aⅴ一区二区三区日本| 99久久久精品视频| 国产精品69页| 日日噜噜夜夜狠狠久久丁香五月| 蜜臀精品一区二区| 91看片在线免费观看| 国产探花在线观看视频| 精品视频在线观看一区二区| 免费黄色日本网站| 国产又黄又猛的视频| 男的插女的下面视频| 天堂av在线网站| www.成年人视频| 中文字幕视频三区| 免费一级特黄毛片| 91性高潮久久久久久久| 久久国产成人精品国产成人亚洲| 久久精品影视大全| 日本福利视频网站| 亚洲欧美偷拍另类| 免费成人午夜视频| 一区二区三区日韩视频| 国产极品粉嫩福利姬萌白酱| 三日本三级少妇三级99| 成人精品视频一区二区| 日韩精品综合在线| 一本之道在线视频| 亚洲第一中文av| 97在线免费公开视频| 国产免费裸体视频| 亚洲一级片免费观看| 无人在线观看的免费高清视频| 免费高清一区二区三区| 国产精品久久久久久久99| 免费午夜视频在线观看| www国产无套内射com| 五月天开心婷婷| 手机版av在线| 性欧美极品xxxx欧美一区二区| 日韩精品xxxx| 国内性生活视频| 欧美日韩成人免费视频| 亚洲成人动漫在线| 黄色影视在线观看| 日本三级中文字幕在线观看| 日韩人妻精品一区二区三区| 99久久久无码国产精品性色戒|