Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

260
Vistas
Hacer que el método de configuración se ejecute solo una vez

Tengo:

 1. IntegrationTestCase extends TestCase 2. UnitTestCase extends TestCase 3. AcceptanceTestCase extends TestCase

En estos tengo muchos métodos no estáticos que se utilizan en muchas pruebas. Todas mis clases de prueba amplían una de estas 3 clases.

Ahora, en muchas clases de prueba, tengo un método de setUp que prepara los datos y servicios necesarios y los asigna a las variables de clase:

 class SomeTestClass extends IntegrationTestCase { private $foo; public function setUp() { parent::setUp(); $bar = $this->createBar(...); $this->foo = new Foo($bar); } public function testA() { $this->foo...; } public function testB() { $this->foo...; } }

El problema es que setUp se ejecuta para cada prueba que anula lo que quería hacer y si el método setUp lleva mucho tiempo, esto se multiplica por la cantidad de métodos de prueba.

Usando public function __construct(...) { parent::__construct(..); ... } crea un problema porque ahora los métodos y clases de nivel inferior de Laravel no están disponibles.

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Para la próxima persona que se encuentre con este problema:

Tuve el problema de que quería migrar la base de datos antes de ejecutar mis pruebas, pero no quería que la base de datos se migrara después de cada prueba individual porque el tiempo de ejecución sería demasiado alto.

La solución para mí fue usar una propiedad estática para verificar si la base de datos ya se migró:

 class SolutionTest extends TestCase { protected static $wasSetup = false; protected function setUp() { parent::setUp(); if ( ! static::$wasSetup) { $this->artisan('doctrine:schema:drop', [ '--force' => true ]); $this->artisan('doctrine:schema:create'); static::$wasSetup = true; } } }
about 4 years ago · Santiago Trujillo Denunciar

0

La solución dada por Saman Hosseini y similares no funcionó para mí. Usar la propiedad estática para marcar el restablecimiento para la próxima clase de prueba.

Para superar esto, escribí una clase de prueba separada para probar la conexión de la base de datos de prueba e inicializar la base de datos de prueba por una vez y asegurarme de que esto se ejecute antes que todas las demás pruebas.

 <?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Artisan; /** * @runTestsInSeparateProcesses */ class DatabaseConnectionTest extends TestCase { /** * Test the database connection * * @return void */ public function testDatabaseConnection() { $pdo = DB::connection()->getPdo(); $this->assertNotNull($pdo); } /** * Initialize the test database for once * * @return void */ public function testInititializeTestDatabase() { Artisan::call('migrate:fresh'); Artisan::call('db:seed'); } }
about 4 years ago · Santiago Trujillo Denunciar

0

No estoy seguro de qué problemas que ve para setUpBeforeClass son estáticos, excepto el mencionado por Mark Baker. Sin embargo, supongo que sabes lo que estás haciendo. Aquí hay una muestra del posible uso.

 class BeforeAllTest extends PHPUnit_Framework_TestCase { private static $staticService; private $service; // just to use $this is tests public static function setUpBeforeClass() { self::createService(); } public static function createService(){ self::$staticService = 'some service'; } /** * just to use $this is tests */ public function setUp(){ $this->service = self::$staticService; } public function testService(){ $this->assertSame('some service', $this->service); } }

ACTUALIZACIÓN: solo un enfoque algo similar que puede ver en https://phpunit.de/manual/current/en/database.html (busque 'Consejo: use su propio caso de prueba de base de datos abstracta'). Estoy seguro de que ya lo está utilizando ya que está realizando pruebas intensivas de db. Pero nadie restringe de esta manera solo los problemas de db.

ACTUALIZACIÓN2: bueno, supongo que tendrías que usar algo como self::createService en lugar de $this->createService (he actualizado el código anterior).

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda