Symfony2 PHPUnit模拟数据库问题

时间:2013-11-22 10:27:28

标签: symfony doctrine-orm mocking phpunit

我一直试图理解“模拟数据库”一段时间,并没有完全理解。我所拥有的是一个Symfony2项目。我有一个控制器,我需要测试它。因此我使用PHPUnit测试。我设法理解除了模拟数据库部分之外的所有其他内容。控制器所做的是对用户进行身份验证。为此,我使用了数据库,并且我不知道如何相应地测试和配置它。这是我尝试过的,

控制器:

class LoginController extends Controller
{
    public function indexAction(Request $request)
    {     
        $em = $this->getDoctrine()->getManager();
        $usersRepo = new UsersRepository($em);

            $form = $this->createForm(new LoginForm());

            $form->handleRequest($request);

            if ($form->isValid()) {

                $request_data = $request->get($form->getName());

                $useremail= $request_data['useremail'];            
                $password = $request_data['password'];

                $user = $usersRepo->userAuthenticate($useremail, $password);

                if($user)
                {                                      
                    $session = $this->getRequest()->getSession();  
                    $session->set('user', $user);
                    return $this->redirect($this->generateUrl('homepage'));             
                }
                else
                {                   
                    $this->get('session')->getFlashBag()->set('notice',’Login Failed’);                      
                }
            }

        return $this->render('TestBundle:Default:login.html.twig', array('form' => $form->createView()));
    }

存储库是“UsersRepository”,实体是“用户”。有了这些细节,我就写了一个测试控制器。

class LoginControllerTest extends WebTestCase {
     public function testlogoutActionValidSessionExist() {

        $employee = $this->getMock('\Test\DABundle\Entity\Users');
        $employee->expects($this->once())
            ->method('userAuthenticate')
            ->with($this->equalTo(‘hello@hotmail.com'), $this->equalTo('testworld'));;

        // Now, mock the repository so it returns the mock of the employee
        $employeeRepository = $this->getMockBuilder('\Doctrine\ORM\ UsersRepository)
            ->disableOriginalConstructor()
            ->getMock();
        $employeeRepository->expects($this->once())
            ->method('find')
            ->will($this->returnValue($employee));

        // Last, mock the EntityManager to return the mock of the repository
        $entityManager = $this->getMockBuilder('\Doctrine\Common\Persistence\ObjectManager')
            ->disableOriginalConstructor()
            ->getMock();
        $entityManager->expects($this->once())
            ->method('getRepository')
            ->will($this->returnValue($employeeRepository));

        $client = static::createClient();               
        $client->request("GET", "/user/login/");

        $this->assertEquals(200 , $client->getResponse()->getStatusCode());
    }   
}

所以在这个测试控制器中,我已经从网上下载代码,但试图理解这一点。请查看我做错了哪里或建议有助于实现这一目标。提前谢谢

1 个答案:

答案 0 :(得分:2)

我认为您不需要实际“模拟”数据库,而是生成一个临时的数据库来运行您的测试。

要创建临时数据库,请将symfony配置为使用SQLite。然后将一些灯具加载到新数据库中,并根据这些灯具对控制器执行测试。

该框架随后处理数据库的删除。

我使用以下套装来协助自动加载灯具。

https://github.com/liip/LiipFunctionalTestBundle

在config_test.yml中建立与sqlite的连接。

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:     pdo_sqlite
                path:       %kernel.cache_dir%/test.db
                charset:    UTF8