成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
JAPANESE少妇高潮潮喷| 人妻少妇精品视频无码专区| 少妇被黑人到高潮喷白浆| 亚洲AV无码成人网站WWW| 亚洲伊人色欲综合网| 99国精产品灬源码1688钻石| 国产AⅤ无码专区亚洲AV综合网| 火车上荫蒂添的好舒服视频| 内射夜晚在线观看| 天堂AV旡码AV毛片毛片免费| 亚洲欧美妆和亚洲妆的区别| IGAO在线视频成人免费| 国产精品亚洲专区无码WEB| 久久婷婷五月综合成人D啪| 人与野鲁交XXXⅩ视频| 性色AV一区二区三区| 中文无码乱人伦中文视频播放| 顶级欧美熟妇高潮XXXXX| 精产国品一二三产区M553麻豆| 欧美激情精品久久久久久黑人| 无码人妻AⅤ一区二区| 一区二区三区高清AV专区| 成人影院YY111111在线观| 狠狠综合久久久久尤物丿| 欧美国产SE综合| 无人区一码二码三码区别在哪 | 香蕉免费一区二区三区在| 在线成人A毛片免费播放| 非洲BBOOMBBOOM的含义| 精品一区二区三人妻视频| 欧美日韩精品成人网站二区A∨有| 挺进绝色老师的紧窄小肉六视频 | 精品久久久久久中文字幕| 欧洲熟妇色XXXXX老妇| 亚洲AV成人精品网站在线播放| 18禁美女黄网站色大片免费看| 高潮又爽又黄又无遮挡动态图| 精品无人区麻豆乱码无限制| 人妻无码一区二区三区四区| 亚洲AV毛片成人精品| 16岁MACBOOKPRO日本| 国产精品久久久久久精品三级| 老头猛挺进小雯的体内视频| 双乳被一左一右吃着的小说| 亚洲AV不卡无码国产| 真人性囗交69图片| 国产ZLJZLJZLJZLJ| 久久亚洲色WWW成人男男| 日本适合十八岁以上人群的护肤品 | 久久久久久久精品免费久精品蜜桃 | 强奷高H猛烈失禁潮喷播放| 小雪第一次交换又粗又大老杨| 44分钟欧美人与禽交片MP4| 国产成人亚洲精品另类动态| 老熟女重囗味HDXX70星空| 天堂AV无码AV一区二区三区| 孕妇特级毛片WW无码内射| 国产CHINESE男男GAY| 久久精品亚洲熟妇少妇任你躁| 日本人妻丰满熟妇久久久久久| 亚洲A级成人无码网站| А√天堂8资源官网在线BT种子| 后Λ式动态后Λ式动态图AV| 人妻无码AⅤ中文字幕| 亚洲国产成人精品福利在线观看| IPHONE欧美高级| 护士HD老师FREE性ⅩⅩⅩⅩ| 日本COSME大赏美白| 亚洲日韩AV无码中文| 成人乱码一区二区三区四区| 久久97人妻AⅤ无码一区| 色窝窝无码一区二区三区色欲| 野花日本免费完整版高清版8| 国产 熟女 高潮 www| 里番ACG ※里番_ACG工口| 无码精品人妻一区二美国区三区| 中中文日产幕无线码一区| 国产精品美女久久久久久| 免费看又黄又无码的网站| 性VIDEOS欧美熟妇HDX| JAPANESE人妻少妇HD| 韩国无码AV片在线观看网站| 欧美性生交XXXXX免费观看| 亚洲成在人线视AV| 成人片黄网站色大片免费观看CN| 久久久不卡国产精品一区二区| 天堂√在线中文资源网| 50岁老熟人乱一区二区三区| 国产专区一线二线三线品牌| 人妻少妇偷人精品无码| 亚洲欧洲专线一区| 番茄TODO社区免费看片| 久久亚洲日韩成人无码| 无码视频一区二区三区在线观看 | 亚州AV无码人妻一区二区三区| MATURETUBE熟女| 狠狠躁狠狠躁东京热无码专区 | 天美传媒MV在线看免费下载安装| 中文字幕三级人妻无码视频| 国产精品亚洲专区无码破解版 | 饥渴人妻欲求不满在线| 日韩欧美人妻系列中文字幕一区二区三区| 一本一道人人妻人人妻ΑV| 国产精品久久久久精品综合紧| 男人J放进女人P全黄动态图| 亚洲AV无码精品色夜午夜网址 | 西西人体自慰扒开下部93| JAPANESE中国丰满少妇| 国产免费无遮挡吃奶视频| 人妻丰满熟妇av无码久久洗澡| 亚洲欧美在线一区中文字幕| 国产国拍亚洲精品MV在线观看| 欧美xxxxx久久短视频| 亚洲А∨天堂久久精品2021| 短篇公交车高H肉辣全集目录| 免费精品一区二区三区第35| 亚洲AV无码专区春药在线观看 | 男人扒开女人的腿做爽爽视频| 亚洲国产AV高清无码| 荡公乱妇HD在线播放BD| 老牛精品亚洲成AV人片| 亚洲AV老熟妇在线观看| 大香伊蕉在人线国产2020年| 麻豆传播媒体APP官网在线观看| 午夜香吻电视剧免费观看| AV无码久久久久久不卡网站| 久久精品99国产AV精品蜜桃| 无码中文字幕AV免费放| 白嫩白嫩BBBBBBBBB-| 久久天天躁夜夜躁狠狠2018| 小宝贝下面的小嘴流水了| 2023国产精品一卡2卡三卡| 精品人妻无码视频一区二区三区 | 美女扒开奶罩露出奶头视频网站| 亚洲AV午夜成人影院老师机影院| 丰满少妇人妻久久久久久| 蜜桃AV一区二区三区| 亚洲国产精品久久久久制服| 国产ww又大又粗又刺激孕妇| 欧美精产国品一二三类产品| 亚洲色国产欧美日韩| 国产精品99无码一区二区| 人人妻人人澡人人爽人人正品| 在线观看草莓视频MV的免费网站| 国内精品宾馆在线精品酒店| 熟妇高潮一区二区麻豆Av渉谷 | 久久久久久久久久久大尺度免费视| 午夜.DJ高清在线观看免费7| 成人免费高清A级毛片| 男朋友想吻我腿中间那个部位 | 色AV永久无码影院AV| 999国内精品永久免费观看| 精品亚洲国产成人| 午夜理论片免费播放| 啊灬啊灬快灬高潮了视频| 久久亚洲AV成人无码精品| 亚洲AV无码1区2区久久| 成年免费视频黄网站在线观看| 免费看国产成年无码AV片| 亚洲欧美日韩国产成人精品影院| 国产猛烈高潮尖叫视频免费| 日韩在线观看视频一区二区| 99久久精品日本一区二区免费 | 久久人人97超碰CAOPORE| 小SAO货撅起屁股扒开GIF动 | 麻花传媒剧在线MV免费观看| 亚洲精品国产精品乱码不99| 国产美女被遭强高潮网站免费| 三上悠亚SSNI-542在线| JEALOUSVUE成熟五十| 老色鬼永久精品网站| 亚洲人成人无码.WWW石榴| 国产精品香蕉成人网在线观看| 色婷婷色综合激情国产日韩| YY8090理论三级在线观看| 免费观看无遮挡WWW的视频| 亚洲一区二区无码成人AV| 国产强奷在线播放| 少妇无码一区二区二三区| 波多野结系列18部无码观看A| 女人18毛片A级毛片| 亚洲制服丝袜AV一区二区三区| 黑人巨大无码中文字幕无码 | JAPANESE 大战黑人| 免费 成 人 黄 色 网站69| 亚洲欧洲日产国码无码AV一| 好硬啊一进一得太深了A片69| 无码中文字幕VA精品影院 | 免费啪啪全程无遮挡60分钟| 夜夜添无码试看一区二区三区| 精品久久久久久国产牛牛| 亚洲AV成人网站在线播放| 国产AⅤ精品一区二区久久| 日本适合十八岁以下的护肤| AV无码小缝喷白浆在线观看| 蜜桃中文字日产乱幕4区| 亚洲综合AV永久无码精品一区二| 黑人异族巨大巨大巨粗| 亚洲 日韩 丝袜 熟女 变态| 国产精品国产三级国产AN|