silinternational/yii2-codeception

实现自yii2-codeception被废弃以来优秀功能的补丁

1.1.0 2022-09-02 17:44 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:13 UTC


README

实现自yii2-codeception被废弃以来优秀功能的补丁

什么/为什么

我们已经使用Yii2开发了几年,现在有几个项目使用yiisoft/yii2-codeception库进行单元测试。
这个库已被弃用,转而使用Codeception模块

不幸的是,这个模块需要大量重构才能以与yii2-codeception类似的方式运行测试。

经过几小时的跟踪和调试,我们发现有两个主要的变化是我们依赖的,因此我们决定创建一个独立的存储库来引入所需的功能。

将数据集加载到数据库中

我们发现的第一件事是在重新配置Codeception以使用Yii2模块后,看起来像

# Codeception Test Suite Configuration

# suite for unit (internal) tests.
class_name: UnitTester
modules:
    enabled:
      - Asserts
      - UnitHelper
      - Yii2:
          configFile: 'tests/codeception/config/unit.php'
          cleanup: true

运行测试时,由于外键约束,无法加载数据集。我们为我们的活动记录类创建了一个新的基类,在beforeLoadafterLoad时分别禁用和启用外键约束。

这个新的基类是Sil\yii\test\ActiveFixture。要使用,只需更新您的数据集文件,使其扩展自它而不是之前的yii\test\ActiveFixture类。

示例数据集类

<?php
namespace tests\unit\fixtures\common\models;

use Sil\yii\test\ActiveFixture;

class UserFixture extends ActiveFixture
{
    public $modelClass = 'common\models\User';
    public $dataFile = 'tests/unit/fixtures/data/common/models/User.php';
}

从测试用例访问数据集

在将数据集正确加载到数据库后,我们发现我们无法以我们习惯的方式访问它们。在使用yii2-codeception的情况下,在测试函数中,我们可以调用$this->fixtureType('fixtureName')来访问特定的数据集记录。在迁移到使用Codeception\TestCase\Test作为我们的单元测试基类而不是yii\codeception\DbTestCase后,我们遇到了关于方法fixtureType不存在于对象上的致命错误。在您使用Yii2 Codeception模块时,通过调用$this->tester->grabFixture('fixtureType', 'fixtureName')来访问数据集。因此,为了解决这个问题,我们为我们的测试创建了一个新的基类,它实现了__call()魔法方法,将方法名和参数传递给新的$this->tester->grabFixture()方法。您可以通过更新您的单元测试,使其扩展Sil\Codeception\TestCase\Test而不是Codeception\TestCase\Test来使用它。

示例测试用例文件

<?php
namespace tests\unit\common\models;

use Sil\Codeception\TestCase\Test;
use tests\unit\fixtures\common\models\UserFixture;

class UserTest extends Test
{
    public function fixtures()
    {
        return [
            'users' => UserFixture::className(),
        ];
    }
    
    public function testGetUser1()
    {
        $user1 = $this->users('user1');
        $this->assertEquals(1, $user1->id);
    }
}