Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

256
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda