Laravel搭建博客 (测试与完成)

这篇文章介绍了一小部分的测试功能,测试的内容为Post.php中用来获取archives变量的函数$archives

测试Archives函数

在Post.php中,曾经写过一个Archives函数用于获取不同的文章发表的时间的组合:

static public function archives(){
return static::selectRaw('year(created_at) year, monthname(created_at) month, count(*) published')
->groupBy('year','month')
->orderByRaw('min(created_at) desc')
->get()
->toArray();
}

接下来以这个函数为例,来大概的了解一下Laravel的测试功能,当然还是要使用PHPUnit。

1.启动PHPUnit

Laravel中自带了PHPUnit的功能,直接在Blog的目录下运行phpunit即可,但是如果事先已经安装过PHPUnit的话,这样直接运行会显示没有测试文件这样的错误,所以需要使用Laravel自带的PHPUnit的完整的路径:vendor/bin/phpunit

Laravel的测试文件在/Test目录之中,关于PhpUnit的详细内容和方法可以参考PHPUnit,这里假定读者已经了解Phpunit的基本测试方法,关于Laravel的测试可以参考Laravel Test

2.编写测试程序

为了简便,直接在Test/ExampleTest.php中编写测试,编写测试的主要内容是:1.从数据库获取两条post的数据并且每一条数据都在不同的月份中发表;2.调用archives函数;3.结果应该以适当的格式反映给测试。

首先,如何从数据库来获取数据?Laravel提供了一个ModelFactory,用来专门生产数据,它在database/factories/ModelFactory.php之中,里面是以User为例,可以在tinker中测试这个factory:

>>> factory('App\User')->make();
=> App\User {#694
name: "Wyman Turcotte",
email: "dbailey@example.com",
}
>>> factory('App\User')->create();
=> App\User {#690
name: "Lottie Bogisich",
email: "ntremblay@example.org",
updated_at: "2017-12-11 09:34:34",
created_at: "2017-12-11 09:34:34",
id: 20,
}
>>> factory('App\User', 2)->create();
=> Illuminate\Database\Eloquent\Collection {#697
all: [
App\User {#685
name: "Miss Melisa Dickens III",
email: "zemlak.anthony@example.org",
updated_at: "2017-12-11 09:34:47",
created_at: "2017-12-11 09:34:47",
id: 21,
},
App\User {#686
name: "Henri Aufderhar",
email: "gpollich@example.com",
updated_at: "2017-12-11 09:34:47",
created_at: "2017-12-11 09:34:47",
id: 22,
},
],
}

可以看到,make方法可以创建一些临时数据,使用save()可以把数据保存到数据库中。create方法可以直接创建许多数据。

来创建一个Post数据工厂:

$factory->define(App\Post::class, function (Faker\Generator $faker) {
return [
'user_id' => 1,
'title' => $faker->sentence,
'body' => $faker->paragraph
];
});

注意这里赋值user_id为1,在这个测试中,user的id值并不重要,在Laravel5.4版本的时候,赋值可以使用闭包,但是5.1中并没有这个功能,所以无法赋一个现有的、正确的id给user_id,所以干脆全部使用1。现在可以继续到测试文件中编写获取数据部分的代码了:

public function testBasicExample()
{
$first = factory(Post::class)->create();

$second = factory(Post::class)->create([
'created_at' => \Carbon\Carbon::now()->subMonth()
]);

$posts = Post::archives();

$this->assertCount(2, $posts);
}

不过现在又出现了一个问题,在我们测试的时候,通常会使用到数据库(这个例子就是如此),但是在正式开发的时候,不能直接拿客户的数据来进行测试,否则会丢失数据;最好是用本地的其他临时数据库或专门的测试数据库来用;所以先到数据库中建立一个测试用的数据库:create database blog_testing;,接下来到Laravel的phpunit.xml中配置一下:

<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_DATABASE" value="blog_testing"/>
</php>

还要记得到.env中更改当前数据库:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=blog_testing
DB_USERNAME=root
DB_PASSWORD=

最后再到终端执行一遍:php artisan migrate重建数据库模型。这里有个问题,更改数据库配置之后Laravel无法更新数据库配置,这个问题我还在寻找答案,找到了再来更新,现在继续使用原来的数据库进行测试。执行测试之后测试成功,并且发现Post表中多出了两条数据,每执行一次数据库中就会多出两条数据,但是这不是想要的效果,让它每次执行完都删除掉数据就好了,幸好这一点很容易做到,在类中添加use DatabaseTransactions;语句就行了,再次执行测试,会发现数据保持不变。

前面使用的是通过数量来测试,现在将测试的准确性加大一点:

public function testBasicExample()
{
$first = factory(Post::class)->create();

$second = factory(Post::class)->create([
'created_at' => \Carbon\Carbon::now()->subMonth()
]);

$posts = Post::archives();

$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);
}

让信息准确的输出,并进行对比。

完成

博客开发到这里,差不多已经完成了;这篇博客的搭建大多是参考Jeffery Way的Laracasts上面的教程,讲的比较细致,关于第一节像是'Mix'以及'Authentication'还有一些其他的与Blog搭建无关的内容我就没有写在这里了,一个原因是Laravel5.1有的功能没有,另一个原因就是与Blog没有关系。其实这个Blog的搭建过程中遇到了许多问题,因为Jeffery Way使用的是Laravel5.4,很多功能在5.1里面有些不同,有些没有,所以只能从文档中查找一些资料来完成,最终项目把它存放在Github Gist之中,以后可能会修改一些样式,但功能大致已经做得差不多了。

这里我想把过程中参考的一些有用的文章链接放到这里:

Gijera · 本站所有文章遵循自由转载-非商用-非衍生-保持署名.
All aritcles of this website follow the CC-3.0 License.知识共享许可协议