Laravel を使用した機能テスト: テスト駆動開発 (コードを使用)
この記事は Laravel の機能テスト、つまりテスト駆動開発 (コードあり) について説明しています。必要な方は参考にしていただければ幸いです。
カルーセル機能テストを作成する
プロジェクトで機能テストを実行するときは、管理バックエンドの機能テストをフロントエンドの機能テストから必ず分離してください。この例では、名前空間 Admin
と Front
を使用して、管理バックエンド テストとフロントエンド ページ テストを分離します。 Admin
和Front
来分离管理后台的测试和前端页面的测试。
现在让我们专注于管理后台carousel
的CRUD功能测试。在test/Feature
目录里添加CarouselFeatureTest
类。
<?php namespace Tests\Feature\Admin\Carousels; use Tests\TestCase; class CarouselFeatureTest extends TestCase { /** @test */ public function it_can_show_the_create_carousel_page() { $employee = factory(User::class)->create(); $this ->actingAs($employee, 'admin') ->get(route('admin.carousel.create')) ->assertStatus(200) ->assertSee('Title') ->assertSee('Subtitle') ->assertSee('Link') ->assertSee('Link Text') ->assertSee('Image'); } }
我们来分析一下上面的代码。
我们需要
->actingAs()
方法来通过用户认证中间件并且模拟admin
用户(如果项目中没有进行使用认证看守器则不需要这一步)。然后我们通过
route()
取出了创建carousel
的页面。断言响应的HTTP状态码为
200
。最后断言会在页面上看到的文本值。
运行phpunit
看看会发生什么。
PHPUnit 6.5.7 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 920 ms, Memory: 26.00MB There was 1 error: 1) Tests\Feature\Admin\Carousels\CarouselFeatureTest::it_can_show_the_create_carousel_page InvalidArgumentException: Route [admin.carousel.create] not defined.
出错就对了。我们还没有在web.php
这个路由文件中定义路由,所以将会出现上面的错误。让我们定义这个路由。
<?php Route::namespace('Admin')->group(function () { Route::resource('carousel', 'Carousels\CarouselController'); });
分析:
在我的
app/Http/Controllers
目录中还有其他目录归置文件和文件夹。我有Admin
,Front
和Auth
这几个目录。在
Admin
这个命名空间中还有Carousels
文件夹,在这个文件夹中是CarouselController.php
文件。
在终端中运行中运行如下命令来创建控制器
php artisan make:controller --resource Admin/Carousels/CarouselController
定义路由、创建好Controller之后,再次运行phpunit
PHPUnit 6.5.7 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 987 ms, Memory: 28.00MB There was 1 failure: 1) Tests\Feature\Admin\Carousels\CarouselFeatureTest::it_can_show_the_create_carousel_page Failed asserting that '' contains "Title".
起作用了!路由错误消失了不过我们遇到了一个新的错误,通过新错误让我们想到应该是测试用例服务在响应的UI页面上找到Title
这个单词。Hmm 好吧,这是应为我们没有在create
方法中返回视图,让我们加上返回视图的代码。
<?php namespace App\Http\Controllers\Admin\Carousels; use App\Http\Controllers\Controller; class CarouselController extends Controller { /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function create() { return view('admin.carousels.create'); } }
视图文件位于resource/views/admin/carousels/create.blade.php
@extends('layouts.admin.app') @section('content') <!-- Main content --> <section class="content"> @include('layouts.errors-and-messages') <p class="box"> <p class="box-body"> <form action="{{ route('admin.carousel.store') }}" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <p class="form-group"> <label for="title">Title</label> <input type="text" name="title" id="title" class="form-control" placeholder="Title" value="{{ old('title') }}"> </p> <p class="form-group"> <label for="image">Image</label> <input type="file" name="image" id="image" class="form-control"> </p> <p class="form-group"> <label for="link">Link</label> <p class="input-group"> <span class="input-group-addon">http://</span> <input type="text" name="link" id="link" class="form-control" placeholder="www.example.com" value="{{ old('link') }}"> </p> </p> <p class="btn-group"> <a href="{{ route('admin.carousel.index') }}" class="btn btn-default btn-sm">Back</a> <button type="submit" class="btn btn-primary btn-sm">Create</button> </p> </form> </p> </p> </section> <!-- /.content --> @endsection
视图文件夹中并没有admin
和carousels
文件夹,所以你需要自己创建它们。
创建好blade视图文件后再次运行phpunit
➜ git: phpunit --filter=CarouselFeatureTest::it_can_show_the_create_carousel_page PHPUnit 6.5.7 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 810 ms, Memory: 28.00MB OK (1 test, 6 assertions)
Nice,看起来非常好。
现在,如果有人搞乱了你的blade模板,你会马上知道因为这个测试会执行失败。到Github里去检查一下到底是谁搞乱模板文件,蛤!
通过POST数据创建carousel
现在让我们测试一下通过页面里的表单是否能够创建carousel
数据。
要创建carousel
别忘了先写测试,没有捷径。
<?php namespace Tests\Feature\Admin\Carousels; use Tests\TestCase; class CarouselFeatureTest extends TestCase { /** @test */ public function it_can_create_the_carousel() { $file = UploadedFile::fake()->create('image.jpg'); $data = [ 'title' => $this->faker->word, 'link' => $this->faker->url, 'image' => $file, ]; $employee = factory(User::class)->create(); $this ->actingAs($employee, 'admin') ->post(route('admin.carousel.store'), $data) ->assertStatus(302) ->assertRedirect(route('admin.carousel.index')) ->assertSessionHas('message', 'Create carousel successful!'); } /** @test */ public function it_can_show_the_create_carousel_page() { $employee = factory(User::class)->create(); $this ->actingAs($employee, 'admin') ->get(route('admin.carousel.create')) ->assertStatus(200) ->assertSee('Title') ->assertSee('Subtitle') ->assertSee('Link') ->assertSee('Link Text') ->assertSee('Image'); } }
分析:
我们断言在创建成功后会重定向到carousel列表页。
我们还断言成功设置了
Create carousel successful!
这个Flash信息
这个测试会执行失败,因为store
()方法现在还空着,让我们用下面的代码填充它:
<?php namespace App\Http\Controllers\Admin\Carousels; use App\Http\Controllers\Controller; use App\Shop\Carousels\Exceptions\CarouselNotFoundException; use App\Shop\Carousels\Exceptions\CreateCarouselErrorException; use App\Shop\Carousels\Exceptions\UpdateCarouselErrorException; use App\Shop\Carousels\Repositories\CarouselRepository; use App\Shop\Carousels\Repositories\CarouselRepositoryInterface; use App\Shop\Carousels\Requests\CreateCarouselRequest; use App\Shop\Carousels\Requests\UpdateCarouselRequest; use Illuminate\Http\UploadedFile; class CarouselController extends Controller { /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function create() { return view('admin.carousels.create'); } /** * @param CreateCarouselRequest $request * @return \Illuminate\Http\RedirectResponse */ public function store(CreateCarouselRequest $request) { try { $data = $request->except('_token'); if ($request->hasFile('image') && $request->file('image') instanceof UploadedFile) { $data['src'] = $request->file('image')->store('carousels', ['disk' => 'public']); } $carouselRepo = new CarouselRepository(new Carousel); $carouselRepo->createCarousel($data); $request->session()->flash('message', 'Create carousel successful!'); return redirect()->route('admin.carousel.index'); } catch (CreateCarouselErrorException $e) { $request->session()->flash('error', $e->getMessage()); return redirect()->back()->withInput(); } } }
然后运行phpunit
carousel
の CRUD 機能のテストに焦点を当てましょう。 CarouselFeatureTest
クラスを test/Feature
ディレクトリに追加します。
➜ git: phpunit --filter=CarouselFeatureTest::it_can_create_the_carousel PHPUnit 6.5.7 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 993 ms, Memory: 28.00MB OK (1 test, 5 assertions)
- ユーザー認証ミドルウェアを渡し、
admin
をシミュレートするには、->actingAs()
メソッドが必要です。 > user (プロジェクトで認証ガードが使用されていない場合、この手順は必要ありません)。 - 次に、
route()
を通じてcarousel
が作成されたページを取り出しました。 - 応答の HTTP ステータス コードが
200
であることをアサートします。 - 最後に、ページに表示されるテキスト値をアサートします。
phpunit
を実行して、何が起こるかを確認します。 rrreee間違っても大丈夫です。ルーティング ファイル web.php
でルートを定義していないため、上記のエラーが発生します。このルートを定義しましょう。 rrreee
-
私のapp/Http/Controllers
ディレクトリには、他のディレクトリ配置ファイルとフォルダーがあります。Admin
、Front
、およびAuth
ディレクトリがあります。 - 🎜
Admin
名前空間にはCarousels
フォルダーもあり、このフォルダーにはCarouselController.php
ファイルがあります。 🎜
phpunit
を再度実行します🎜rrreee🎜動作します!ルーティング エラーは消えましたが、新しいエラーが発生したため、テスト ケース サービスが応答する UI ページで Title
という単語を見つけたと考えられました。うーん、これは create
メソッドでビューを返していないためです。ビューを返すコードを追加しましょう。 🎜rrreee🎜ビュー ファイルは resource/views/admin/carousels/create.blade.php
にあります🎜rrreee🎜 admin
と carousels はありませんcode> フォルダーはビューフォルダー内にあるため、自分で作成する必要があります。 🎜🎜ブレード ビュー ファイルを作成した後、<code>phpunit
を再度実行します🎜rrreee🎜 いいですね、とても良く見えます。 🎜🎜これで、誰かがブレード テンプレートをいじった場合、テストは失敗するため、すぐにわかります。 Github にアクセスして、誰がテンプレート ファイルをめちゃくちゃにしたのかを確認してください。 🎜🎜POST データを使用してカルーセルを作成する🎜🎜 次に、ページ上のフォームを使用して carousel
データを作成できるかどうかをテストしてみましょう。 🎜🎜カルーセル
を作成するには、最初にテストを書くことを忘れないでください。近道はありません。 🎜rrreee🎜分析: 🎜- 🎜カルーセル リスト ページは、作成が成功した後にリダイレクトされると主張します。 🎜
- 🎜また、
Create carousel success!
フラッシュ情報が正常に設定されたことも主張します 🎜
store が存在するため、このテストは失敗します
() メソッドはまだ空です。次のコードを埋めてみましょう: 🎜rrreee🎜 次に、phpunit
を実行します🎜rrreee🎜 他のコントローラー メソッドを作成するときにも、このような機能テストを作成します。準備を整えてください。持ち帰り。 🎜🎜おすすめ関連記事: 🎜🎜🎜Nginxプロキシサービスとは何ですか? nginxのフォワードプロキシとリバースプロキシの例 🎜🎜🎜🎜 Laravelのコレクションクラスの使い方まとめ(コード) 🎜🎜🎜🎜laravel5.5フレームワークでビュー間でデータを共有する2つの方法(添付) コード)🎜🎜🎜🎜🎜以上がLaravel を使用した機能テスト: テスト駆動開発 (コードを使用)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Laravelの電子メールの送信が失敗したときに戻りコードを取得する方法。 Laravelを使用してアプリケーションを開発する場合、検証コードを送信する必要がある状況に遭遇することがよくあります。そして実際には...

LaravelスケジュールタスクRAN RANSPONSIVEトラブルシューティングRALAVELのスケジュールタスクスケジューリングを使用すると、多くの開発者がこの問題に遭遇します。スケジュール:実行...

Laravelの電子メールの検証コードの送信の障害を処理する方法は、Laravelを使用することです...

DCATを使用するときにDCATADMIN(Laravel-Admin)にデータを追加するためにカスタムクリックのテーブル関数を実装する方法...

Laravel - ダンプサーバー - Laravel ダンプサーバーには、Laravel 5.7 のバージョンが付属しています。以前のバージョンにはダンプ サーバーが含まれていません。ダンプサーバーはlaravel/laravelコンポーザーファイルの開発依存関係になります。

Laravel FrameworkでRedis接続の共有の影響とLaravelフレームワークとRedisを使用する際のメソッドを選択すると、開発者は問題に遭遇する可能性があります。

Laravel Multi-Tenant拡張機能パッケージStancl/Tenancyのカスタムテナントデータベース接続Laravel Multi-Tenant ExtensionパッケージStancl/Tenancyを使用したマルチテナントアプリケーションを構築する際の...

Laravel - アクション URL - Laravel 5.7 では、「呼び出し可能なアクション URL」と呼ばれる新機能が導入されています。この機能は、アクションメソッドで文字列を受け入れるLaravel 5.6の機能に似ています。 Laravel 5.7 で導入された新しい構文の主な目的は、
