tl; dr:
- Si y sólo si quieres ir todo el recorrido de pruebas funcionales, entonces te recomiendo mirando hacia arriba Sgoettschkes's answer.
- Si quieres unidad de probar la aplicación y tiene que probar el código que interactúa con la base de datos, ya sea leyendo o saltar directamente a symfony2 docs
Había ciertos aspectos de mi pregunta original que hacen que sea clara que mi comprensión de las diferencias entre pruebas unitarias y pruebas funcionales era deficiente. (Como ya he escrito, quiero probar la aplicación de manera unitaria, pero también estaba hablando de la prueba del controlador al mismo tiempo, y esas son pruebas funcionales por definición).
Las pruebas unitarias solo tienen sentido para los servicios y no para los repositorios. Y esos servicios pueden usar burlas del administrador de la entidad.
Mi caso de uso real para mi aplicación estaba, de hecho, muy bien reflejado en los documentos symfony2 en how to test code that interacts with the databse.Proporcionan este ejemplo para una prueba de servicio: Clase
Servicio:
use Doctrine\Common\Persistence\ObjectManager;
class SalaryCalculator
{
private $entityManager;
public function __construct(ObjectManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function calculateTotalSalary($id)
{
$employeeRepository = $this->entityManager
->getRepository('AppBundle:Employee');
$employee = $employeeRepository->find($id);
return $employee->getSalary() + $employee->getBonus();
}
}
Servicio clase de prueba:
namespace Tests\AppBundle\Salary;
use AppBundle\Salary\SalaryCalculator;
use AppBundle\Entity\Employee;
use Doctrine\ORM\EntityRepository;
use Doctrine\Common\Persistence\ObjectManager;
class SalaryCalculatorTest extends \PHPUnit_Framework_TestCase
{
public function testCalculateTotalSalary()
{
// First, mock the object to be used in the test
$employee = $this->getMock(Employee::class);
$employee->expects($this->once())
->method('getSalary')
->will($this->returnValue(1000));
$employee->expects($this->once())
->method('getBonus')
->will($this->returnValue(1100));
// Now, mock the repository so it returns the mock of the employee
$employeeRepository = $this
->getMockBuilder(EntityRepository::class)
->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(ObjectManager::class)
->disableOriginalConstructor()
->getMock();
$entityManager->expects($this->once())
->method('getRepository')
->will($this->returnValue($employeeRepository));
$salaryCalculator = new SalaryCalculator($entityManager);
$this->assertEquals(2100, $salaryCalculator->calculateTotalSalary(1));
}
}
Ninguna base de datos de prueba requerida para ese tipo de prueba, solamente (dolorosa) burlona.
Como es importante probar la lógica comercial, no la capa de persistencia.
Sólo para prueba funcional que tiene sentido tener su propia base de datos de prueba que se debe construir y derribar después, y la gran pregunta debe ser:
Cuando hacer pruebas funcionales sentido?
Yo solía pensar que prueba todas las cosas es la respuesta correcta; sin embargo, después de trabajar con un montón de software heredado que en sí mismo apenas fue desarrollado, me volví un poco más perezoso pragmático y considero que ciertas funcionalidades funcionan hasta que se demuestre lo contrario por un error.
Supongamos que tengo una aplicación que analiza un XML, crea un objeto y almacena esos objetos en una base de datos. Si se sabe que funciona la lógica que almacena los objetos en la base de datos (como en: la empresa requiere los datos y, hasta el momento, no está rota), e incluso si esa lógica es una gran pila de basura, no hay inminente necesito probar eso. Como todo lo que necesito para asegurarme de que mi analizador XML extraiga los datos correctos. De la experiencia puedo deducir que se almacenarán los datos correctos.
Existen escenarios en los que la prueba funcional es bastante importante, es decir, si se escribiera una tienda en línea. Allí sería crítico para los negocios que los artículos comprados se almacenaran en la base de datos y aquí la prueba funcional con toda la base de datos de la prueba tiene mucho sentido.
Estoy trabajando en el mismo problema. ¿Alguna suerte hasta ahora? –
@JasonSwett Nope. Acabo de comenzar una recompensa debido a la falta de una respuesta satisfactoria. – k0pernikus