【问题标题】:How to unit test active record pattern static methods?如何对活动记录模式静态方法进行单元测试?
【发布时间】:2015-07-14 20:54:44
【问题描述】:
我想知道如何对活动记录模式进行单元测试?我在这个项目中使用 Yii 2,我知道通常我会想要制作模拟并使用依赖注入将这些模拟插入到我的测试类中 - 但是,我不知道如何使用静态方法来做到这一点,因为我'没有在任何地方实例化类?例如,在 Yii 的活动记录类中,我将执行以下操作以从数据库中选择一行:
ExampleTable::find()->where(['id' => 10])->one();
有什么想法可以模拟这个使用静态方法直接使用数据库的类吗?
【问题讨论】:
标签:
php
unit-testing
activerecord
mocking
yii2
【解决方案1】:
在 Yii2 中存在 codeception 并且您可以使用库 codeception/AspectMock 来模拟所有静态而无需依赖注入:
https://github.com/Codeception/AspectMock
这是来自官方 AspectMock 手册的示例:
允许对静态方法进行存根和模拟。
让我们重新定义静态方法并在运行时验证它们的调用。
<?php
function testTableName()
{
$this->assertEquals('users', UserModel::tableName());
$userModel = test::double('UserModel', ['tableName' => 'my_users']);
$this->assertEquals('my_users', UserModel::tableName());
$userModel->verifyInvoked('tableName');
}
我希望它会有所帮助。
【解决方案2】:
几个想法:
- 将 db 相关内容提取到某种 Repository/DAO 类中,将其作为依赖项注入并在您的测试中进行模拟
- 提取与 db 相关的内容以分离测试中可见的方法并使用部分模拟
- 使用实际使用 db 的测试,因此准备数据作为测试设置的一部分,运行方法并根据从 db 返回的内容验证结果 -> 但是它可能不符合您的单元测试定义:)李>