对FuelPHP模型进行单元测试

对FuelPHP模型进行单元测试,php,unit-testing,activerecord,fuelphp,Php,Unit Testing,Activerecord,Fuelphp,因此,我有一个非常简单(至少现在是这样)的模型,它通过主键ID返回联系人: class Model_Contact extends \Fuel\Core\Model { public function get_by_id($contact_id) { return Entity_Contact::find_by_pk($contact_id); } } Entity\u Contact类如下所示(省略了不相关的数组内容): 注:\Core\Entity\

因此,我有一个非常简单(至少现在是这样)的模型,它通过主键ID返回联系人:

class Model_Contact extends \Fuel\Core\Model
{
    public function get_by_id($contact_id)
    {
        return Entity_Contact::find_by_pk($contact_id);
    }
}
Entity\u Contact
类如下所示(省略了不相关的数组内容):

注:
\Core\Entity\u Base
扩展了
\Fuel\Core\Model\u Crud

我可以在这样的控制器中使用:

$model = new Model_Contact();
$contact = $model->get_by_id(4);
我知道,为了进行单元测试,我应该模拟实际的数据库调用(
Entity\u Contact::find\u by\u pk
),但我不确定如何做。由于我使用的是Fuel的
Model\u crud
功能(DB访问器实际上是域对象模型的一部分),所以我不确定是否可以完全模拟数据库,或者可能我遗漏了什么

所以问题是:您将如何为
Model_Contact::get_by_id()
编写测试


提前谢谢

您的测试可能需要创建对象,以便您可以测试您的方法

  • 创建存储到数据库的对象
  • 测试通过\u id获取\u
  • 删除创建的对象

  • 这不是世界上最光荣的事情,但它将完成测试你的方法。。。meh?

    您的测试可能必须创建对象,以便您可以测试您的方法

  • 创建存储到数据库的对象
  • 测试通过\u id获取\u
  • 删除创建的对象

  • 这不是世界上最光荣的事情,但它将完成测试你的方法。。。meh?

    如果使用AspectMock,您可以轻松地模拟它。

    如果使用AspectMock,您可以轻松地模拟它。

    我没有使用Fuel,但它似乎比OOP更具程序性,到处都是静态调用,使用类作为函数包[1]。对于可测试的东西,它必须使用显式依赖项编写,以便可以注入实际对象或伪对象(mock或stub)。您应该看看其他框架,比如一切都可以轻松测试的框架,因为它基于这个原则。[1] :(查看“find”方法。它调用\DB::select(),等等)你是对的,当我深入研究这个方法时,我发现它不太可测试。事实上,我们今天所知道的MVC和各种框架文档中所宣扬的完全忽略了可测试性。并没有什么强迫你们的,若你们不想,你们甚至不需要从控制器扩展(我们只是为了方便起见)。实体对象是普通的老php对象,没有可扩展的基本模型,因为我们使用数据映射器模式。另一方面,起步可能有点困难(与其他框架相比),但这是因为有很多关于web开发的知识,Symfony2涵盖了web开发的大部分方面,始终使用最佳实践。我没有使用Fuel,但它似乎比OOP更具过程性,到处都是静态调用,使用类作为函数包[1]。对于可测试的东西,它必须使用显式依赖项编写,以便可以注入实际对象或伪对象(mock或stub)。您应该看看其他框架,比如一切都可以轻松测试的框架,因为它基于这个原则。[1] :(查看“find”方法。它调用\DB::select(),等等)你是对的,当我深入研究这个方法时,我发现它不太可测试。事实上,我们今天所知道的MVC和各种框架文档中所宣扬的完全忽略了可测试性。并没有什么强迫你们的,若你们不想,你们甚至不需要从控制器扩展(我们只是为了方便起见)。实体对象是普通的老php对象,没有可扩展的基本模型,因为我们使用数据映射器模式。另一方面,入门可能有点困难(与其他框架相比),但这是因为有很多关于web开发的知识,Symfony2涵盖了web开发的大部分方面,始终使用最佳实践。是的,因为我无法模拟实际的数据库访问器对象,所以这是我唯一的选择。是的,因为我不能模拟实际的数据库访问器对象,所以这是我唯一的选择。呸,骗子。
    $model = new Model_Contact();
    $contact = $model->get_by_id(4);