Doctrine2 Unittest模拟关系中的实体

时间:2011-01-13 15:08:14

标签: php unit-testing mocking doctrine-orm

我正在尝试创建一个服务类的unittest - 注入了EntityManager的类,负责加载和创建实体。

问题在于:: create(array)方法,用于创建实体并设置所有必需相关实体的实体。所以我认为最好使用模拟对象,但是当我使用下面的代码时(也可以在这里看到:How to create a mock object of a doctrine entity?

<?php
public function testCreate($email, $password)
{
    $role = $this->getMock('Role');
    $this->service->create(
        array('email' => $email,
              'password' => $password,
              'role' => $role));
}

// service (simplified)
public function create(array $values)
{
    $user = new User();
    $user->setEmail($values['email'])
        ->setPassword($values['password'])
        ->setRole($values['role']);

    $this->getDatabaseManager()->persist($user)->flush();

    return $user;
}
?>

触发:通过未配置为级联持久操作的关系找到新实体

使用:

$this->service->getDatabaseManager()->persist($role);

在测试触发器中:类Mock_Role_c64eda12不是有效实体或映射超类。

我如何解决这个问题或者我可以使用哪种更好的方法? (不知道哪一个更适用于此......如果整个'服务创造并持续存在'或其他任何不好的想法请告诉我)

1 个答案:

答案 0 :(得分:2)

你不想在这里模拟角色,你想要模拟EntityManager。如果您不想模拟实体管理器,那么您正在进行功能测试,在这种情况下,您还可以使用真正的Role对象。