Php 如何对活动记录模式静态方法进行单元测试?
我想知道如何对活动记录模式进行单元测试?我在这个项目中使用Yii 2,我知道通常我会制作模拟,并使用依赖注入将这些模拟插入到我的测试类中——但是,我不知道如何使用静态方法来实现这一点,因为我没有在任何地方实例化这个类?例如,在Yii的活动记录类中,我将执行以下操作从数据库中选择一行:Php 如何对活动记录模式静态方法进行单元测试?,php,unit-testing,activerecord,mocking,yii2,Php,Unit Testing,Activerecord,Mocking,Yii2,我想知道如何对活动记录模式进行单元测试?我在这个项目中使用Yii 2,我知道通常我会制作模拟,并使用依赖注入将这些模拟插入到我的测试类中——但是,我不知道如何使用静态方法来实现这一点,因为我没有在任何地方实例化这个类?例如,在Yii的活动记录类中,我将执行以下操作从数据库中选择一行: ExampleTable::find()->where(['id'=>10])->one() 你知道我将如何模拟这个使用静态方法直接与数据库一起工作的类吗?在Yii2中存在codeception并且你可以使用lib
ExampleTable::find()->where(['id'=>10])->one()代码>
你知道我将如何模拟这个使用静态方法直接与数据库一起工作的类吗?在Yii2中存在codeception
并且你可以使用librarycodeception/AspectMock
来模拟所有静态而无需依赖注入:
这是官方AspectMock手册中的示例:
允许对静态方法进行存根和模拟
让我们重新定义静态方法,并在运行时验证它们的调用
两个想法:
- 将db相关的内容提取到某种类型的Repository/DAO类中,将其作为依赖项注入,并在测试中模拟
- 将db相关的内容提取到测试中可见的单独方法中,并使用部分模拟
- 使用实际使用db的测试,所以准备数据作为测试设置的一部分,运行方法并根据db返回的内容验证结果->但是它可能不符合单元测试定义:)
<?php
function testTableName()
{
$this->assertEquals('users', UserModel::tableName());
$userModel = test::double('UserModel', ['tableName' => 'my_users']);
$this->assertEquals('my_users', UserModel::tableName());
$userModel->verifyInvoked('tableName');
}