[Laravel] 15 - REST API: sidebar with unit test

前言


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

 

 

 

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 就会报错。

 

posted @ 2018-07-13 10:35  郝壹贰叁  阅读(274)  评论(0编辑  收藏  举报