您好,欢迎访问一九零五行业门户网

Laravel的功能测试:测试驱动开发(附代码)

本篇文章给大家带来的内容是关于laravel的功能测试:测试驱动开发(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
创建carousel功能测试在对你的项目进行功能测试的时候,一定要确保管理后台的功能测试要与前台的功能测试隔离开来。在本例中,我通过命名空间admin和front来分离管理后台的测试和前端页面的测试。
现在让我们专注于管理后台carousel的crud功能测试。在test/feature目录里添加carouselfeaturetest  类。
<?phpnamespace 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.00mbthere was 1 error:1) tests\feature\admin\carousels\carouselfeaturetest::it_can_show_the_create_carousel_pageinvalidargumentexception: route [admin.carousel.create] not defined.
出错就对了。我们还没有在web.php这个路由文件中定义路由,所以将会出现上面的错误。让我们定义这个路由。
<?phproute::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.00mbthere was 1 failure:1) tests\feature\admin\carousels\carouselfeaturetest::it_can_show_the_create_carousel_pagefailed asserting that '' contains title.
起作用了!路由错误消失了不过我们遇到了一个新的错误,通过新错误让我们想到应该是测试用例服务在响应的ui页面上找到title这个单词。hmm 好吧,这是应为我们没有在create方法中返回视图,让我们加上返回视图的代码。
<?phpnamespace 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_pagephpunit 6.5.7 by sebastian bergmann and contributors..                                                                   1 / 1 (100%)time: 810 ms, memory: 28.00mbok (1 test, 6 assertions)
nice,看起来非常好。
现在,如果有人搞乱了你的blade模板,你会马上知道因为这个测试会执行失败。到github里去检查一下到底是谁搞乱模板文件,蛤!
通过post数据创建carousel现在让我们测试一下通过页面里的表单是否能够创建carousel数据。
要创建carousel别忘了先写测试,没有捷径。
<?phpnamespace 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()方法现在还空着,让我们用下面的代码填充它:
<?phpnamespace 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
➜  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.00mbok (1 test, 5 assertions)
在编写其他控制器方法时也像这样写功能测试,准备好出发吧。
相关文章推荐:
什么是nginx代理服务?nginx正向代理和反向代理的实例
laravel中collection类的使用方法总结(代码)
laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法(附代码)
以上就是laravel的功能测试:测试驱动开发(附代码)的详细内容。
其它类似信息

推荐信息