viraj / cakephp-testdummy
CakePHP 测试用的工厂类
Requires
- php: >=7.2.0
- cakephp/cakephp: ^4.0
- cakephp/chronos: ^2.0
- cakephp/migrations: ^3.0
- fakerphp/faker: ~1.4
- symfony/finder: ^3.3
Requires (Dev)
- phpunit/phpunit: ^5.7|^6.0|^7.0|^8.5
Conflicts
- phpunit/phpunit: <5.7
README
Testdummy 提供了一种创建随机测试数据的方法。在编写测试时,您需要随机/假数据来运行测试。
Testdummy 帮助您创建一组随机假数据,您可以在测试中根据需要精确配置。
第 1 步:安装
使用 Composer 安装此包
composer require viraj/cakephp-testdummy
第 2 步:创建一个工厂文件
在 config/Factories
目录下,创建一个包含以下内容的 TableFactory.php
文件
# config/TableFactory.php <?php $factory = \TestDummy\Definition::getInstance();
在 config/Factories
目录下,您可以创建任意数量的 PHP 文件,这些文件将被我们的包自动加载。
第 3 步:编写一个工厂
在使用工厂之前,您必须在上述文件中定义它们。一个示例工厂定义可能如下所示
<?php $factory = \TestDummy\Definition::getInstance(); $factory->define('Posts', function (Faker\Generator $faker) { return [ 'title' => $faker->sentence, 'author' => $faker->name, 'body' => $faker->paragraph, 'published' => true, ]; });
在 TableFactory.php
中,您将能够访问 $faker
变量,它是 Faker 包中 Generator
类的实例。使用 Faker,您可以创建各种类型的数据,甚至获取符合您所在国家/地区的数据。请阅读 Faker 的文档以了解它们的 API。
第 4 步:使用工厂
要使用工厂,您的测试需要扩展 \TestDummy\BaseTestCase
。这个类扩展了 CakePHP 核心中的 IntegrationTestCase
,因此您将获得所有核心功能和断言。
如果您正在使用 Integrated 包,您不需要扩展
BaseTestCase
。只需扩展 Integrated 包中的适当类,工厂将自动加载。
现在,您可以在测试中使用您定义的工厂。
/** @test */ public function user_can_edit_a_post() { $post = factory('Posts')->create(); $this->post('/posts/edit/' . $post->id, [ 'title' => 'Updated Post', 'author' => 'Updated Author', 'body' => 'Updated Random body text', 'published' => true, ]); //Your assertions }
第 5 步:数据库迁移
固定值在每次测试之前创建表,并在每次测试后删除它们。当使用固定值时,您需要定义固定值文件,以及导入或配置每个测试中要使用的固定值名称。
或者,您可以使用 DatabaseMigrations
特性,它将在每次测试之前迁移数据库,并在每次测试后删除所有表。以下是如何操作的示例
namespace App\Test\TestCase; use TestDummy\Traits\DatabaseMigrations; class ViewPostListTest extends BaseTestCase { use DatabaseMigrations; /** @test */ public function user_can_see_published_posts() { factory('Posts')->create(['title' => 'Nate Emmons post']); factory('Posts')->create(['title' => 'Megan Danz post']); $this->get('/posts'); $this->assertResponseContains('Nate Emmons post'); $this->assertResponseContains('Megan Danz post'); } /** @test */ public function user_cannot_see_unpublished_posts() { factory('Posts')->create(['title' => 'Nate Emmons post', 'published' => false]); factory('Posts')->create(['title' => 'Megan Danz post', 'published' => false]); $this->get('/posts'); $this->assertResponseNotContains('Nate Emmons post'); $this->assertResponseNotContains('Megan Danz post'); } }
覆盖属性
在您使用工厂的同时,还可以在测试中覆盖特定的属性
factory('Posts')->create(['title' => 'Your custom title']);
上述代码将在数据库中生成一个具有上述标题和其余字段的假数据的帖子记录。
工厂集合
如果您想创建包含 100 个帖子的集合,可以使用以下语法
$posts = factory('Posts', 100)->create();
上述代码将创建 100 个帖子记录,并返回一个包含 100 个帖子的 Cake\Collection\Collection
实例。