yunbuye/thinkphp-testing

ThinkPHP 友好的测试扩展

0.8.2 2020-01-08 13:15 UTC

This package is auto-updated.

Last update: 2022-01-08 18:37:06 UTC


README

一个测试友好的ThinkPHP测试扩展

安装

composer require yunbuye/thinkphp-testing --dev

修改 phpunit.xml 文件,在 phpunit 标签加入 bootstrap="vendor/autoload.php"

<?xml version="1.0" encoding="UTF-8"?>
<phpunit 
        ...
        bootstrap="vendor/autoload.php"
        ...
>
...
</phpunit>

使用时注意

  1. 测试类必须继承 Yunbuye\ThinkTesting\TestCase 测试类
  2. 如果不是使用thinkPHP命令(php think unit) 运行的测试,需要设置 $app_path 和加载基础文件。
    例:
    namespace Tests;
    
    use Yunbuye\ThinkTesting\TestCase as BaseTestCase;
    
    abstract class TestCase extends BaseTestCase
    {
        protected $app_path = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'application';//指定应用目录
        protected $baseUrl = 'http://localhost';
    
        public function __construct($name = null, array $data = [], $dataName = '')
        {
            require_once __DIR__ . '/../thinkphp/base.php';//加载基础文件
            parent::__construct($name, $data, $dataName);
        }
    }

功能

  1. 模拟对象
    只要是使用容器进行管理的对象,都可以使用以下方法进行模拟(具体的 Mockery 使用方法,请参考 文档

    use Mockery;
    use Mockery\Mock;
    
    $this->instance('think\Cache', Mockery::mock('think\Cache', function ($mock) {
        /**
         * @var Mock $mock
         */
        $return='return';
        $key='key';
        return $mock->shouldReceive('get')->with($key)->andReturn($return);
    }));

    为了让以上过程更加便捷:

    use Mockery;
    use Mockery\Mock;
    
    $this->mock('think\Cache', function ($mock) {
        /**
         * @var Mock $mock
         */
        $return='return';
        $key='key';
        return $mock->shouldReceive('get')->with($key)->andReturn($return);
     });

    同样,如果你想侦查一个对象,基本测试用例类提供了一个便捷的 spy 方法作为 Mockery::spy 的替代方法:

    use App\Service;
    use Mockery\Mock;
    
    $this->spy('think\Cache', function ($mock) {
        /**
         * @var Mock $mock
         */
        $return='return';
        $key='key';
        return $mock->shouldReceive('get')->with($key)->andReturn($return);
    });
  2. 每次测试后数据库回滚
    每次运行测试用例后,为了不互相污染数据,可以选择数据库回滚。
    例:

    namespace Tests;
    
    use Yunbuye\ThinkTesting\TestCase as BaseTestCase;
    use Yunbuye\ThinkTesting\Traits\DatabaseTransactions;
    
    abstract class TestCase extends BaseTestCase
    {
        use DatabaseTransactions;//每次测试回滚数据
        protected $app_path = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'application';//指定应用目录
        protected $baseUrl = 'http://localhost';
    
        public function __construct($name = null, array $data = [], $dataName = '')
        {
            require_once __DIR__ . '/../thinkphp/base.php';//加载基础文件
            parent::__construct($name, $data, $dataName);
        }
    }
  3. Facade mock 模拟
    安装扩展(不要加--dev)

    composer require yunbuye/thinkphp-facade 

    具体使用,请参考 yunbuye/thinkphp-facade

  4. 模型工厂
    安装扩展(加--dev)

    composer require yunbuye/thinkphp-model-factory 

    具体使用,请参考 yunbuye/thinkphp-model-factory