unit testing - unitarias - Cómo probar las funciones de unidad que usan sugerencias tipo
test unitarios ejemplos (3)
La forma más fácil de usar un espacio de nombres completo es la siguiente:
$dependencyMock = $this->getMockBuilder(Dependency::class)
->disableOriginalConstructor()
->getMock();
$testable = new Testable($dependencyMock);
Llamar al método estático de la clase devuelve el espacio de nombre. Esto hace que la refacturación con un IDE sea mucho más fácil
Digamos que tengo una clase que contiene una función que usa sugerencias de tipo como esta:
class Testable
{
function foo (Dependency $dependency)
{
}
}
Y quiero probar esta clase en una Testable
usando este código:
$dependencyMock = $this->getMockBuilder(''Dependency'')
->disableOriginalConstructor()
->getMock();
$testable = new Testable($dependencyMock);
Si uso PHPUnit para crear un stub de $ dependency y luego trato de llamar a la función foo
usando este simulacro (como en el ejemplo anterior), obtendré un error fatal que dice:
Argumento 1 pasado a la función foo () debe ser una instancia de Dependencia, instancia de Mock_Foo dado
¿Cómo puedo probar la unidad esta función con PHPUnit y todavía con la $dependency
?
Mi explicación para la respuesta de Shakil:
Yo tuve el mismo problema.
Siguiendo el libro de cocina symfony2, creé un simulacro de
/Doctrine/Common/Persistence/ObjectManager
y mi constructor de servicio fue:
use Doctrine/ORM/EntityManager;
/* ... */
public function __construct(EntityManager $oEm)
{
$this->oEm = $oEm;
}
Así que creé mi prueba de unidad (siguiendo el libro de cocina symfony2):
$entityManager = $this->getMockBuilder(''/Doctrine/Common/Persistence/ObjectManager'')
->disableOriginalConstructor()
->getMock();
$myService = new MyService($entityManager);
Luego tuve el error:
Argument 1 passed to MyService::__construct() must be an instance of Doctrine/ORM/EntityManager, instance of Mock_ObjectManager_f4068b7f given
Primero pensé que la sugerencia de tipo era incompatible con las pruebas unitarias, porque se pasó una instancia simulada al constructor en lugar de una instancia de EntityManager.
Entonces, después de algunas investigaciones, la clase Mock_ObjectManager_f4068b7f es de hecho una clase dinámica que amplía la clase de tu simulacro (en mi caso, Doctrine / ORM / EntityManager ), por lo que la sugerencia de tipo no es un problema y funciona bien.
Mi solución fue crear un simulacro de Doctrine / ORM / EntityManager en lugar de / Doctrine / Common / Persistence / ObjectManager :
$entityManager = $this->getMockBuilder(''/Doctrine/ORM/EntityManager'')
->disableOriginalConstructor()
->getMock();
$myService = new MyService($entityManager);
Estoy empezando con las pruebas unitarias, por lo que puede encontrar mi explicación evidente: p
Use el espacio de nombres completo cuando use burlas, esto solucionará el problema de la herencia burlona.
$dependencyMock = $this->getMockBuilder(''/Some/Name/Space/Dependency'')
->disableOriginalConstructor()
->getMock();
$testable = new Testable($dependencyMock);