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一区二区
可以在线看黄的网站| 激情文学亚洲色图| 欧美aaa在线观看| 丰满少妇在线观看| 欧美视频第三页| 日韩黄色片视频| 97国产精东麻豆人妻电影 | 妞干网在线观看视频| 久久精品国产精品亚洲精品色| 99热这里只有精品在线播放| 丰满少妇久久久| a√天堂在线观看| 欧美爱爱视频免费看| 亚洲熟妇无码一区二区三区导航| 白白操在线视频| 神马午夜伦理影院| 国产美女永久无遮挡| 青草青青在线视频| www.中文字幕在线| 国内自拍视频网| 182午夜在线观看| 国产911在线观看| 成人免费网站入口| 欧美xxxxx在线视频| 国产精品无码av无码| 高清av免费看| 国产小视频免费| 精品少妇一区二区三区在线| 日本毛片在线免费观看| 免费看污黄网站| 国产经典久久久| 国产情侣av自拍| 日韩视频在线免费播放| 国产97在线 | 亚洲| 国产三级精品三级在线| 精品人妻大屁股白浆无码| 欧美色图色综合| 91蝌蚪视频在线| 国产视频一视频二| 99精品一区二区三区的区别| 免费观看黄色的网站| 男女曰b免费视频| 国产女同无遮挡互慰高潮91| 成年人视频大全| 91 视频免费观看| 亚洲国产精品久久久久婷蜜芽| 在线观看高清免费视频| 成年人看的毛片| 五月天综合婷婷| 亚洲国产精品毛片av不卡在线| 手机成人av在线| 久久99999| 老太脱裤让老头玩ⅹxxxx| 香港日本韩国三级网站| 欧美黄网站在线观看| 蜜桃网站在线观看| 亚洲综合123| 成人黄色一区二区| 91专区在线观看| av在线观看地址| 粉嫩av一区二区三区天美传媒| 艹b视频在线观看| 六月丁香婷婷激情| 97国产在线播放| 各处沟厕大尺度偷拍女厕嘘嘘| 欧美日韩午夜爽爽| 91xxx视频| 国产奶头好大揉着好爽视频| 中国黄色片一级| 色婷婷综合网站| 男人的天堂最新网址| 久久久精品麻豆| 亚洲综合欧美激情| 成人亚洲免费视频| 亚洲黄色av片| 777久久精品一区二区三区无码| 搡的我好爽在线观看免费视频| 三级视频中文字幕| 中文 日韩 欧美| 久久久成人精品一区二区三区| 国产精品嫩草影院8vv8 | 国产成人亚洲精品无码h在线| 国产aaa免费视频| 俄罗斯av网站| 99视频免费播放| 中文字幕第17页| www.男人天堂网| 国产深夜男女无套内射| 国产裸体舞一区二区三区| 天天碰免费视频| 日韩av加勒比| 99热久久这里只有精品| 国产成人无码一二三区视频| 北条麻妃69av| 亚洲精品性视频| 久久天天东北熟女毛茸茸| 青青艹视频在线| 亚洲另类第一页| 国产二级片在线观看| 日本中文字幕精品—区二区| 只有这里有精品| 亚洲国产精品久久久久婷蜜芽| 国产日韩欧美久久| 青青青在线视频播放| 欧美黑人又粗又大又爽免费| 亚洲国产午夜精品| 欧美v在线观看| 超碰成人在线免费观看| 37pao成人国产永久免费视频| 九九热精品国产| 一区二区传媒有限公司| 久久久精品视频国产| 日本福利视频在线| 天天爱天天做天天操| 国产aaa一级片| 婷婷视频在线播放| 美女黄色片视频| 成年人视频网站免费观看| 手机在线免费毛片| 一本久道中文无码字幕av| 浴室偷拍美女洗澡456在线| 亚洲欧美另类动漫| 久久久久久久久久久视频| 日本一级淫片演员| www,av在线| www.日日操| 超碰影院在线观看| 99草草国产熟女视频在线| 日本免费不卡一区二区| 在线免费观看视频黄| 日本免费黄视频| 久久网站免费视频| 青青草原av在线播放| 欧美一级视频免费看| 每日在线观看av| 成人在线播放网址| 日本十八禁视频无遮挡| 久久久国内精品| 久久观看最新视频| 亚洲av综合色区| 免费cad大片在线观看| 久久久久久久免费视频| 日本高清免费观看| 妞干网这里只有精品| 黄色网络在线观看| 国产高清不卡无码视频| 欧美一级爱爱视频| 欧美日韩成人免费视频| 91av资源网| 无需播放器的av| 成人午夜免费剧场| 成人久久久久久久久| 日日噜噜噜噜久久久精品毛片| 91淫黄看大片| 黄色www在线观看| 黄色a级片免费看| 日本在线观看a| 久久久久久综合网| 丰满人妻一区二区三区53号| 国产免费黄色一级片| 动漫av网站免费观看| 亚洲妇熟xx妇色黄蜜桃| 欧洲精品在线播放| 少妇高清精品毛片在线视频| 午夜两性免费视频| 日韩精品久久一区二区| 91av在线免费播放| 日本福利视频导航| 日韩视频第二页| 永久免费网站视频在线观看| 国产伦精品一区二区三区四区视频_| 日本一本二本在线观看| 香蕉视频色在线观看| 久激情内射婷内射蜜桃| 国产色视频在线播放| 777av视频| 日韩video| 国产一级片自拍| 成人精品视频一区二区| 免费cad大片在线观看| 欧美第一页浮力影院| 成人免费观看cn| 国内精品国产三级国产99| 成人亚洲视频在线观看| 男人添女荫道口女人有什么感觉| 污污动漫在线观看| 少妇高清精品毛片在线视频 | 91猫先生在线| 黄色网在线视频| 亚洲高清视频免费| 一区二区三区入口| 国产成人久久777777| 亚洲熟妇无码一区二区三区| 一本之道在线视频| 波多野结衣免费观看| 一个色综合久久| 无码内射中文字幕岛国片| 日韩在线视频在线观看| 免费黄色福利视频| 苍井空浴缸大战猛男120分钟|