我一直试图理解“模拟数据库”一段时间,并没有完全理解。我所拥有的是一个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());
}
}
所以在这个测试控制器中,我已经从网上下载代码,但试图理解这一点。请查看我做错了哪里或建议有助于实现这一目标。提前谢谢
答案 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