成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

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

如何在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號
狼人香蕉毛片AV高潮视频| 久久精品无码一区二区小草| 欧美黑人又大又粗高潮喷水| 色一情一乱一伦一视频免费看| 野花日本大全免费观看2019 | 野外XXXXFREEXXXX日| 国产成人精品无码播放| 每天都在挨CAO中醒来H| 亚洲AV图片一亚洲AV| H精品无码动漫在线观看| 精品久久久无码人妻中文字幕| 少妇伦子伦情品无吗| √最新版天堂资源网在线| 国产在线无遮挡免费观看| 日本适合十八岁以下的护肤| 又大又长粗又爽又黄少妇视频| 国产免费无遮挡吸乳视频在线观看| 欧美精品一区二区三区在线| 亚洲色欲色欲色欲WWW| 国产精品自产拍高潮在线观看| 日本大肚子孕妇交XXX| 中文天堂在线最新版在线WWW| 国内精品久久久人妻中文字幕| 色一情一乱一伦一视频免费看| 99久久无码一区人妻| 久久久久99精品成人片试看| 小辣椒AV福利在线网站| 成年性生交大片免费看| 浓毛BGMBGMBGM胖老太太| 亚洲色精品AⅤ一区区三区| 国产手机在线国内精品| 少妇高潮毛片免费看| 啊灬啊灬快灬高潮了视频| 免费XXXXX大片在线观看一区| 亚洲欧美日韩在线观看一区二区三| 国产精品亚洲АV久久| 少妇伦子伦情品无吗| 暴躁妹妹CSGO| 欧美国产SE综合| 在我们寝室当寄吧套子怎么样| 精品亚洲AⅤ无码午夜在线 | 亚洲AV无码久久| 国产精品青青青高清在线| 色欲色香天天天综合无码| 锕锕锕锕锕锕好大好深APP | 俄罗斯大荫蒂女人毛茸茸| 欧美野外疯狂做受XXXX高潮| 51VV社区视频在线视频观看| 久久影院午夜理论片无码| 亚洲色成人网站WWW永久男男| 好爽…又高潮了免费毛片| 午夜天堂一区人妻| 国产精品WWW夜色视频| 四虎亚洲精品成人A在线观看| 菠萝视频免费最新在线观看| 人妻少妇精品中文字幕av蜜桃| AV天堂久久天堂色综合| 内地CHINA麻豆VIDEOS| 中文字幕无码无码专区| 毛片TV网站无套内射TV网站| 一二三四在线观看视频韩国 | 国产午夜亚洲精品理论片不卡| 色噜噜狠狠一区二区三区| 成人国产三级在线观看| 日本JAPANESE猛男GAY| 办公室双腿打开揉弄高潮淑芬| 内射在线CHINESE| 99精品国产一区二区电影| 秘密列车在线全集免费观看| 又硬又粗又长又爽免费看| 老色鬼久久亚洲AV综合| 中文字幕肉感巨大的乳专区| 男女无遮挡猛进猛出免费视频| 18禁裸乳啪啪无遮裆网站| 久久久久久亚洲精品成人| 夜夜爱夜夜做夜夜爽| 久久青青草原亚洲AV无码APP| 亚洲一区无码精品色| 久久香蕉国产线看观看手机| 宅男666在线永久免费观看| 免费AV资源网站| 99精品国产福利在线观看| 人伦片无码中文字| 成人毛片18女人毛片免费| 日本熟老太日本老熟网站| 绯色AV永久无码一区二区蜜臀| 天天看片在线完整版| 国产毛片毛多水多的特级毛片| 亚洲AV老熟妇在线观看| 精品一区二区三区无码视频| 野花免费高清完整在线观看| 蜜臀AV永久免费看片| А√8天堂中文官网资源| 日本熟妇人妻ⅩXXXX| 国产成人福利在线视频播放下载| 无遮挡又黄又刺激的视频| 好男人官网资源在线观看| 亚洲综合AV色婷婷国产野外| 男生女生一起相差差差30| 本道久久综合无码中文字幕| 天堂А√在线中文在线| 国产丝袜无码一区二区视频 | 伊人久久大香线焦AV综合影院| 娜娜的YIN荡生涯H全文阅读| 波多野42部无码喷潮| 无码AV大香线蕉| 精品欧洲AV无码一区二区三区 | 国产毛多水多五月激情四射| 亚洲乱码日产精品M| 免费无码午夜福利片| 被黑人下药做得受不了| 天美传媒MV在线播放高清视频| 国产无遮挡18禁无码网站| 亚洲午夜精品一区二区| 欧美人妻精品一区二区三区 | 少妇被 到高潮喷出白浆av| 国产无遮挡又爽又黄的视频 | 久久久亚洲欧洲日产国码农村 | 天天躁日日躁狠狠躁视频2021 | 野花高清完整版免费观看视频电视 | 国内精品久久久久久久小说| 一边下奶一边吃面膜视频| 欧美丰满熟妇乱XXXXX视频| 国产SUV精品一区二区88L| 亚洲精品性爱av| 欧美顶级METART裸体全部自慰 | 十八18禁国产精品WWW| 好男人好资源在线影视官网 | 免费真人视频网站直播下载| 大桥久未无码吹潮在线观看| 亚洲插肏熟女人妇的屄网址| 嫩草影院网站进入| 国产成人精品午夜二三区波多野| 亚洲精品无码久久毛片| 欧美美女多人群交视频| 国产精品欧美福利久久| 中国 韩国 日本 免费看| 日日摸夜夜爽无码毛片精选| 精产国品一二三产区区别在哪儿 | 野花日本韩国视频免费高清观看| 人妻体内射精一区二区三区| 国内精品久久久久久影院| 97精品国产手机| 西西人体自慰扒开下部93| 麻豆国产成人AV高清在线观看| 粉嫩大学生无套内射无码卡视频| 亚洲人成电影网站色WWW| 破外女出血视频全过程| 国产无人区卡一卡二卡乱码| 18未满禁止免费69影院| 无人区卡一卡二入口| 免费A级毛片波多野结衣| 国产精品久久久久精品| 中国老太婆XXXXX| 无码人妻精一区二区三区老牛| 蜜桃AV无码乱码精品| 国产经典一区二区三区蜜芽| 中文天堂在线WWW最新版官网| 推高她的裙子挺身而入| 美女把腿扒开让我添视频| 国产妇女馒头高清泬20P多| 中文无码VR最新无码AV专区| 我和几个亲戚都做了爱| 免费无码又黄又爽又刺激| 国产在线无遮挡免费观看| 2021国内精品久久久久精品| 午在线亚洲男人午在线| 男女啪啪进出阳道猛进| 国精产品一二二区传媒有哪些| XXXCHINESE国产HD| 亚洲熟妇无码中文高清| 日日摸夜夜添夜夜添毛片性色AV| 精品熟女少妇AV免费观看| 二级毛片免费视频播放| 在线日韩日本国产亚洲| 午夜福利麻豆国产精品| 破外女出血视频全过程| 久久人妻少妇嫩草AV蜜桃| 国产精品久久久久精品日日| JIZZJIZZ国产在线观看| 亚洲毛片无码专区亚洲乱| 天美传媒国产电视推荐| 欧美精品一区二区三区在线 | 人人添人人妻人人爽夜欢视AV| 久久精品久久久久久噜噜| 国产精品未满十八禁止观看| АV天堂手机版在线观看| 亚洲乱码在线卡一卡二卡新区| 少妇高潮XXXⅩ白浆699| 免费人成网站在线观看欧美| 精品成人乱色一区二区| 国产A级毛片久久久精品毛片| JULIA无码人妻中文字幕在线| 野花影视大全在线观看免费高清| 性一交一乱一色一视频| 色综合AV综合无码综合网站| 欧美老熟妇手机在线观看| 久久亚洲国产精品成人AV秋霞| 国产小伙和50岁熟女59P| 成人综合色在线一区二区|