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一区二区
亚洲黄色网址在线观看| 亚洲制服在线观看| 性一交一乱一伧国产女士spa| 国产自产在线视频| 丰满的少妇愉情hd高清果冻传媒 | 精品一区二区成人免费视频 | 茄子视频成人免费观看| 波多野结衣家庭教师在线播放| 国产高清不卡无码视频| 老司机激情视频| 国内外成人激情免费视频| а 天堂 在线| 在线观看18视频网站| 成年人视频大全| 日韩欧美猛交xxxxx无码| 中文字幕人妻熟女人妻洋洋| 日韩av在线播放不卡| 日本在线xxx| 男女啪啪网站视频| 在线看免费毛片| 97av中文字幕| 欧美成人xxxxx| 亚洲欧美自偷自拍另类| 欧美 国产 精品| 131美女爱做视频| 欧美一级特黄a| 黄色一级视频播放| 国产精品久久..4399| www日韩视频| 精品少妇人妻av一区二区| 成人一级生活片| 玩弄japan白嫩少妇hd| 老司机久久精品| 屁屁影院ccyy国产第一页| 免费在线观看毛片网站| 亚洲精品偷拍视频| 九色porny91| 激情六月天婷婷| 国内国产精品天干天干| 精品国产av无码一区二区三区| 成年人视频网站免费观看| 日本特黄在线观看| 欧在线一二三四区| 国产成人在线小视频| 日韩欧美亚洲另类| 日本精品免费在线观看| 日本丰满少妇黄大片在线观看| 欧美成人精品欧美一级乱| 国产精品久久国产| 国产传媒免费观看| 黄色国产小视频| 91av资源网| 免费一级特黄特色毛片久久看| 亚洲18在线看污www麻豆| 精品久久久久久久免费人妻| av高清在线免费观看| 992tv成人免费观看| 亚洲综合激情视频| 亚洲人视频在线| 国产一二三四在线视频| 激情内射人妻1区2区3区| 波多野结衣家庭教师在线播放| 欧美高清中文字幕| 国产乱子伦精品无码专区| 黄色录像特级片| 国产尤物av一区二区三区| 国产四区在线观看| 最近中文字幕免费mv| 欧洲精品视频在线| 国产av不卡一区二区| 先锋影音男人资源| 欧美一二三不卡| 人人妻人人做人人爽| 成人网站免费观看入口| 俄罗斯av网站| 毛葺葺老太做受视频| 污版视频在线观看| 国产乱女淫av麻豆国产| 热这里只有精品| 久无码久无码av无码| 亚欧无线一线二线三线区别| 无码人妻丰满熟妇区毛片| 超碰在线播放91| 97超碰人人爽| 一卡二卡三卡视频| 久久久久久久激情| 天天综合天天添夜夜添狠狠添| 性欧美18一19内谢| 国产爆乳无码一区二区麻豆| 男女啪啪免费视频网站| 免费看a级黄色片| 黄色一级片网址| 欧美精品一区免费| 一区二区三区 欧美| 波多野结衣与黑人| 久久精品视频91| av动漫在线播放| 看欧美ab黄色大片视频免费| 视频一区二区视频| 国产成人精品视频免费看| 亚洲天堂av一区二区| 久久久久久免费看| 亚洲最大天堂网| 内射国产内射夫妻免费频道| 亚洲天堂网2018| 国产人妻777人伦精品hd| 久久精品一卡二卡| 丁香啪啪综合成人亚洲| 国产一区二区三区播放| 青青青国产在线视频| 亚洲精品国产suv一区88| 杨幂毛片午夜性生毛片 | 日韩av片网站| 2018国产在线| 在线观看av的网址| 日韩一区二区三区不卡视频| 阿v天堂2017| www.国产二区| 日本三级中文字幕在线观看| 日本人视频jizz页码69| 欧美日韩第二页| 欧美一区二区三区爽大粗免费| 久久综合亚洲精品| 亚洲 欧洲 日韩| 日韩a一级欧美一级| 亚洲三级视频网站| 国产一级片黄色| 日本三级免费观看| 少妇高潮喷水久久久久久久久久| 好色先生视频污| 喜爱夜蒲2在线| 日韩视频 中文字幕| 天天操天天干天天玩| 污免费在线观看| 2025韩国大尺度电影| 成年人三级黄色片| 中文字幕资源在线观看| 自拍偷拍21p| 青娱乐精品在线| 50度灰在线观看| 日本人体一区二区| 国产一区二区三区精彩视频| 免费高清在线观看免费| 亚洲黄色a v| 亚洲妇熟xx妇色黄蜜桃| 欧洲精品视频在线| 丁香六月激情婷婷| 无码人妻丰满熟妇区五十路百度| 欧美精品一区二区三区免费播放| 牛夜精品久久久久久久| 一区二区久久精品| 91免费国产精品| 日韩 欧美 高清| 三年中文在线观看免费大全中国| 久久久久xxxx| 国产特级黄色大片| 亚洲欧美日韩精品一区| 国产精品久久国产| 波多野结衣天堂| 日本黄网站色大片免费观看| ww国产内射精品后入国产| 精品亚洲一区二区三区四区| 国产高清不卡无码视频| 激情网站五月天| 日韩中文在线字幕| 91看片就是不一样| 国产日韩第一页| 在线看的黄色网址| 亚洲熟妇av日韩熟妇在线| 一级黄色录像在线观看| 国产精品专区在线| 午夜av中文字幕| 中文字幕欧美人妻精品一区| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 亚洲女人在线观看| 免费在线观看日韩视频| 特级西西人体www高清大胆| 99视频在线免费| 日本人体一区二区| 特级黄色录像片| 黄色片在线免费| 久久久久久免费看| 国产成人生活片| 中文字幕第22页| 中文字幕永久视频| 欧美视频免费播放| 少妇高潮毛片色欲ava片| 日本天堂免费a| 992tv成人免费观看| 国产乱叫456| 加勒比av中文字幕| 国产三级三级看三级| 91淫黄看大片| 日韩在线第三页| 国产无套粉嫩白浆内谢的出处| 国产日产欧美视频| 欧美日韩在线不卡视频| 丝袜老师办公室里做好紧好爽| 久久国产精品视频在线观看| 精品国产一区二区三区无码|