Home > Article > PHP Framework > Functional testing with Laravel: test-driven development (with code)
The content of this article is about Laravel’s functional testing: test-driven development (with code). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you. .
When performing functional testing on your project, be sure to isolate the functional testing of the management background from the functional testing of the front-end. In this example, I use the namespaces Admin
and Front
to separate the management backend testing and the front-end page testing.
Now let us focus on the CRUD functional testing of the management background carousel
. Add the CarouselFeatureTest
class in the test/Feature
directory.
<?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'); } }
Let’s analyze the above code.
We need the ->actingAs()
method to pass the user authentication middleware and simulate the admin
user (if it is not used in the project Authentication guards do not require this step).
Then we took out the page that created carousel
through route()
.
Assert that the HTTP status code of the response is 200
.
The final assertion is the text value that will be seen on the page.
Run phpunit
and see what happens.
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.
It’s okay to make a mistake. We have not defined the route in the routing file web.php
, so the above error will occur. Let's define this route.
<?php Route::namespace('Admin')->group(function () { Route::resource('carousel', 'Carousels\CarouselController'); });
Analysis:
There are other directory placement files and folders in my app/Http/Controllers
directory. I have these directories Admin
, Front
and Auth
.
There is also a Carousels
folder in the Admin
namespace, and in this folder is CarouselController.php
document.
Run the following command in the terminal to create the controller
php artisan make:controller --resource Admin/Carousels/CarouselController
After defining the route and creating the Controller, run it againphpunit
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".
It works! The routing error disappeared but we encountered a new error. The new error made us think that the test case service found the word Title
on the response UI page. Hmm Well, this is because we did not return the view in the create
method, let us add the code to return the view.
<?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'); } }
The view file is located in the 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
views folder and does not have the admin
and carousels
folders, so you need to create them yourself.
After creating the blade view file, run it againphpunit
➜ 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, it looks very good.
Now, if someone messes with your blade template, you'll know immediately because the test will fail. Go to Github and check to see who messed up the template files, duh!
Now let us test whether carousel
data can be created through the form on the page.
To create carousel
Don’t forget to write the test first, there are no shortcuts.
<?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'); } }
Analysis:
We assert that the carousel list page will be redirected after successful creation.
We also assert that the Create carousel successful!
This Flash information
This test will fail to execute because The store
() method is still empty now, let’s fill it with the following code:
<?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(); } } }
Then run phpunit
➜ 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)
while writing other Write functional tests like this for controller methods, and you're ready to go.
Recommended related articles:
What is Nginx proxy service? Examples of nginx forward proxy and reverse proxy
Summary of usage of collection class in Laravel (code)
The above is the detailed content of Functional testing with Laravel: test-driven development (with code). For more information, please follow other related articles on the PHP Chinese website!