前言


实现一个博客的侧边栏的链接,然后顺便对其进行单元测试的过程。

Archives


一、视图中展示SQL结果

  • 一条 sql 语句【查询】
select
  year(created_at) year,
  monthname(created_at) month,
  count(*) published
from posts
group by year, month
order by created_at desc
  • 对应的 ORM语句【测试】

$ php artisan tinker

App\Post::selectRaw('year(created_at) year, monthname(created_at) month, count(*) published')
   ->groupBy('year', 'month')
   ->get()
   ->toArray();
  • 侧边栏链接的'视图'【展示】
<ol class="list-unstyled">
  @foreach ($Archives as $stats)
    <li>
      <a href="#">{{ $stats['month'] }}</a>
    </li>
  @endforeach
</ol>

以上可以通过URL中的参数触发。

  • URL中的时间参数解析【触发】
if ($month = request('month')) {
  $posts->whereMonth('created_at', Carbon::parse($month)->month);
}

Ref: Laravel Carbon函数

也可以选择year和month一并解析,然后直接触发 ORM语句,如下:

$posts = Post::latest()
    ->filter(request(['month', 'year']))
    ->get();

二、static 在类中的延迟静态绑定

Ref: PHP static关键字的用法及注意点

延迟静态绑定:指允许在一个静态继承的上下文中引用被调用类。

延迟绑定的意思为:static::不再为定义当前方法所在的类,而是实际运行时所在的类。注:它可以用于(但不限于)静态方法的调用。

单元测试


一、测试过程

  • 一次测试

[1] 调用 phpunit 命令

[2] 对ExampleTest.php进行单元测试。

[3] 测试的代码:ExampleTest.php

class ExampleTest extends TestCase
{
  public function testBasicTest()
  {
    $response = $this->get('/');
    $response->assertStatus(200);     $this->get('/')->assertSee('The Bootstrap Blog');
  }
}
  • $factory 自动封装了testing & seeding

Ref: [Laravel] 08 - Auth & Data Migration

[1] 原封装

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| Here you may define all of your model factories. Model factories give
| you a convenient way to create models for testing and seeding your
| database. Just tell the factory how a default model should look.
|
*/ $factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});

[2] 根据自己的数据表修改内容

  • 使用 $factory 进行 数据填充

[ExampleTest.php]

class ExampleTest extends TestCase
{
  use DatabaseTransaction;
  public function testBasicTest()
  {
    // 生成两条数据
    $first = factory(Post::class)->create();
    $second = factory(Post::class)->create([
      'created_at' => \Carbon\Carbon::now()->subMonth()
    ]);     // When I fetch the archives.
    $Posts = post::archives();
    // Then the response should be in the proper format.
    $this->assertCount(2, $posts);  # '断言'限定了只能为两条
  }
}

运行这个单元测试:

$ phpunit tests/Unit/ExampleTest.php

$this->assertCount(...);

$this->assertCount(0, ['foo']);  //判断数组长度是否为传入参数

$this->assertEquals(...);

$this->assertEquals([
  [
    "year" => $first->created_at->format('Y'),
    "month" => $first->created_at->format('F'),
    "published" => 1
  ],
  [
    "year" => $second->created_at->format('Y'),
    "month" => $second->created_at->format('F'),
    "published" => 1
  ],    
], $posts);

如果,模型中返回的数据不符合条件,例如忘记了 orderByRaw,那么上述 assertEquals 就会报错。

[Laravel] 15 - REST API: sidebar with unit test的更多相关文章

  1. 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法

    利用Laravel 搭建oauth2 API接口 要求 laravel 5.4以上 安装 $ composer require laravel/passport 在配置文件 config/app.ph ...

  2. [Laravel] 14 - REST API: Laravel from scratch

    前言 一.基础 Ref: Build a REST API with Laravel API resources Goto: [Node.js] 08 - Web Server and REST AP ...

  3. Laravel POST请求API接口 使用validate表单验证返回欢迎页

    突然遇到的问题  就是使用Laravel进行开发API接口的时候  发现在表单验证不通过的时候返回了登录页 猜测问题应该是因为表单验证失败后进行了重定向导致的 因为返回状态码200 网上找了好久没找到 ...

  4. laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效

    laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...

  5. laravel使用Dingo\Api通过response()->json()返回空对象

    laravel使用Dingo\Api写接口跟android对接时,android一直反应解析错误,无法解析数据. { "status_code":200, "messag ...

  6. laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  7. 【转】简单的 Laravel 5 REST API

    Introduction Almost all successful internet based companies have APIs. API is an acronym for Applica ...

  8. Laravel 的 JSON API 接口自动化测试

    Laravel 自带了两种测试类型 Feature Test: 功能测试.针对类似接口这种流程性的测试. Unit Test: 单元测试.针对单个函数这种输入输出结果的测试. 新建一个 Feature ...

  9. [Laravel] 10 - WEB API : wrapper

    前言 一.常用的解决方案 React 前端 + PHP (Laravel) 后端 Such as "some exposure to WEB API’s and/or RESTful“. 使 ...

随机推荐

  1. HttpServerProvider实现http服务接口(一)

    啥也不说了,直接上代码,简单的示例. 服务端代码: package dyan.server; import java.io.BufferedReader; import java.io.IOExcep ...

  2. Menu实现逻辑

        一.前奏 创建一个WS_EX_NOACTIVATE的窗体 创建窗体后注册Hook消息(鼠标在非Menu区域点击时关闭menu,接收键盘消息用于快捷键,接WM_SETFOCUS消息,当打开新窗体 ...

  3. AnguarJS中链式的一种更合理写法

    假设有这样的一个场景: 我们知道一个用户某次航班,抽象成一个departure,大致是: {userID : user.email,flightID : "UA_343223",d ...

  4. WordPress基础:极简手动安装教程

    1.下载WordPress 2.将解压后的文件夹,放到网站根目录,并重命名为你喜欢的目录如:w, 3.重命名文件wp-config-sample.php 为 wp-config.php,并进行配置 4 ...

  5. test.cpp:(.text+0xc0): undefined reference to `cv::imread(std::string const&, int)'

    opencv报错: test.cpp:(.text+0xc0): undefined reference to `cv::imread(std::string const&, int)' te ...

  6. linux性能采用工具oprofile使用

    1.先收藏几篇博文,先解决问题,周末继续. http://www.cnblogs.com/bangerlee/archive/2012/08/30/2659435.html http://blog.s ...

  7. 【GPU编解码】GPU硬解码---DXVA (转)

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  8. PHP —— 识别运算符实现逻辑比较

    最近遇到一个功能的开发,大致意思就是根据用户输入的条件,进行相关的比较操作.本来打算使用用户选择运算符的方式,但是后来结合项目实际,发现需要使用用户输入的自定义运算比较现实一点.大致意思就是: 1.用 ...

  9. [转]Greenplum 执行计划之广播与重分布

    关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的.关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移.数据迁移有广播和重分布两种.在GP中,每一个广播或重分布会产生 ...

  10. tensorflow 笔记10:tf.nn.sparse_softmax_cross_entropy_with_logits 函数

    函数:tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,name=None) ...