php - 如何对事件记录模式静态方法进行单元测试?

标签 php unit-testing activerecord mocking yii2

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

有什么想法可以模拟这个使用静态方法直接处理数据库的类吗?

最佳答案

在 Yii2 中存在 codeception 并且您可以使用库 codeception/AspectMock 来模拟所有静态而无需依赖注入(inject):

https://github.com/Codeception/AspectMock

这是官方 AspectMock 手册中的示例:

Allows stubbing and mocking of static methods.

Let's redefine static methods and verify their calls at runtime.

<?php 
function testTableName() 
{
     $this->assertEquals('users', UserModel::tableName());   
     $userModel = test::double('UserModel', ['tableName' => 'my_users']);
     $this->assertEquals('my_users', UserModel::tableName());
     $userModel->verifyInvoked('tableName');  
}

希望对您有所帮助。

关于php - 如何对事件记录模式静态方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31417163/

相关文章:

php - 如何将数组作为多个参数传递给函数?

ruby-on-rails - 重新加载模型属性

ruby-on-rails - 使用 Rails ActiveAdmin 时是否可以有一个只有两个主键的连接表?

ruby-on-rails - rails : How can I set multiple attributes to the same value upon create?

c# - 模拟 DbProviderFactory

git - 使用服务器端 Hook 实现 TDD 的红/绿/重构文化

php - 如何在将变量加载到 cake php 的页面之前将变量附加到所有 javascript 文件?

php - 我如何制作幻灯片,从数据库中获取信息(图像、标题、内容)?

php - 如何在使用 PHP 的浏览器上按下 'Refresh' 按钮后删除 $_POST 变量?

objective-c - Xcode - 调试单元测试目标