silinternational / yii2-codeception
实现自yii2-codeception被废弃以来优秀功能的补丁
Requires
- php: >=5.6.0
- codeception/codeception: >=2.2
- yiisoft/yii2: ^2.0.5
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
运行测试时,由于外键约束,无法加载数据集。我们为我们的活动记录类创建了一个新的基类,在beforeLoad
和afterLoad
时分别禁用和启用外键约束。
这个新的基类是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); } }