本篇文章给大家带来的内容是关于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的功能测试:测试驱动开发(附代码)的详细内容。
