如何对活动记录模式静态方法进行单元测试?

时间:2015-07-14 20:54:45

标签: php unit-testing activerecord mocking yii2

我想知道如何对单元测试活动记录模式进行测试?我在这个项目中使用Yii 2,我明白通常我会想做模拟并使用依赖注入将这些模拟插入到我的测试类中 - 但是,我不知道如何使用它静态方法,因为我没有在任何地方实例化类?例如,在Yii的活动记录类中,我将执行以下操作从数据库中选择一行: ExampleTable::find()->where(['id' => 10])->one();

我是如何模拟这个使用静态方法直接使用数据库的类的?

2 个答案:

答案 0 :(得分:2)

在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');  
}

我希望它会有所帮助。

答案 1 :(得分:0)

一些想法:

  • 将db相关内容提取到某种Repository / DAO类,将其作为依赖项注入并在测试中进行模拟
  • 提取与数据库相关的内容以分离测试中可见的方法并使用部分模拟
  • 使用实际使用db的测试,因此准备数据作为测试设置的一部分,运行方法并根据db返回的内容验证结果 - &gt;但它可能不符合您的单元测试定义:)