database - Laravel 5 टेस्ट के बीच यूनिट परीक्षण के लिए डाटाबेस को रिसाइड करना




unit-testing laravel-5 (2)

क्यों नहीं अपना खुद का आदेश बनाएं जैसे कि db: reset यह कमांड या तो आपकी सभी टेबलों को छांटती है या स्कीमा बनाते हैं / फिर स्मेमा बनाएं और माइग्रेट करें।

अपने परीक्षण में आप फिर उपयोग करें: $this->call('db:reset') अपने परीक्षणों के बीच में

मैं एक वरीयता प्राप्त डेटाबेस से शुरुआत करता हूं और Laravel 5 में यूनिट परीक्षणों के बीच डेटाबेस की खोज करने की कोशिश कर रहा हूं। Laravel 4 में मैं समझता हूं कि आप केवल रोशन / समर्थन \ Facades \ Artisan का उपयोग कर सकते हैं और आज्ञाओं को चला सकते हैं

कारीगर :: कॉल ( 'विस्थापित'); कारीगर :: कॉल ( 'db: बीज');

या आप अनुमान लगा सकते हैं:

$ This-> बीज ( 'DatabaseSeeder');

प्रत्येक परीक्षण से पहले ऐसा लगता है कि Laravel 5 में प्रतिस्थापित किया गया है

डेटाबेसमैग्रेशन का उपयोग करें; या डेटाबेस संचार प्रयोग;

मैंने इनका उपयोग करने की कोशिश की है और डेटाबेस को माइग्रेट करने के लिए परीक्षण प्राप्त करने में कामयाब रहे हैं; हालांकि, यह वास्तव में तालिकाओं में डेटा नहीं शोधता है मैंने इस बारे में शिकायत करने वाले कई मंचों के माध्यम से पढ़ा है और टेस्टकेस और हर टेस्ट के अंदर इनसे कई अलग-अलग तरीकों की कोशिश की है।

    $this->beforeApplicationDestroyed(function () {
        Artisan::call('migrate');
        Artisan::call('migrate:reset');
        Artisan::call('db:seed');
        DB::disconnect();
    });

TestCase.php टायरडाउन () के लिए ...

मैंने भी जोड़ने की कोशिश की है

$this->createApplication();

TestCase.php से हर परीक्षा में बुलाया गया एक तरीका

कभी-कभी यह मेरी टेबल पूरी तरह से पोंछते हैं मुझे Laravel की साइट या ब्लॉग्स में कोई भी काम नहीं लग रहा है। इसका एक हिस्सा शायद इसलिए है क्योंकि मैं शायद Laravel 5 में Laravel 4 तरीकों की कोशिश कर रहा हूं। क्या यह Laravel 5 में कोई तरीका है?

Testcase.php के लिए मेरा कोड ऐसा दिखता है:

<?php

use Illuminate\Support\Facades\Artisan as Artisan;

class TestCase extends Illuminate\Foundation\Testing\TestCase{

    use Illuminate\Foundation\Testing\WithoutMiddleware;
    use Illuminate\Foundation\Testing\DatabaseMigrations;
    use Illuminate\Foundation\Testing\DatabaseTransactions;

    protected $baseUrl = 'http://localhost';


    public function initializeTests(){

        $this->createApplication();

       Artisan::call('migrate');
       $this->artisan('migrate');
       Artisan::call('db:seed');
       $this->artisan('db:seed');
       $this->seed('DatabaseSeeder');
       $this->session(['test' => 'session']);
       $this->seed('DatabaseSeeder');

    }

    public function tearDown()
    {
      Mockery::close();
      Artisan::call('migrate:reset');
      $this->artisan('migrate:reset');
      Artisan::call('migrate:rollback');
      $this->artisan('migrate:rollback');
      Artisan::call('migrate');
      $this->artisan('migrate');
      Artisan::call('db:seed');
      $this->artisan('db:seed');
      $this->seed('DatabaseSeeder');
      DB::disconnect();

         foreach (\DB::getConnections() as $connection) {
             $connection->disconnect();
         }

      $this->beforeApplicationDestroyed(function () {
         Artisan::call('migrate:reset');
         $this->artisan('migrate:reset');
         Artisan::call('migrate:rollback');
         $this->artisan('migrate:rollback');
         Artisan::call('migrate');
         $this->artisan('migrate');
         Artisan::call('db:seed');
         $this->artisan('db:seed');
         $this->seed('DatabaseSeeder');
         DB::disconnect();
         foreach (\DB::getConnections() as $connection) {
             $connection->disconnect();
         }
      });

       $this->flushSession();
       parent::tearDown();


    }

    public function getConnection()
    {
        $Connection = mysqli_connect($GLOBALS['DB_DSN'], $GLOBALS['DB_USERNAME'], $GLOBALS['DB_PASSWORD'], $GLOBALS['DB_DATABASE']);
        $this->createDefaultDBConnection();
        return $this->Connection;
    }

    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();

        return $app;
    }

    /**
     * Magic helper method to make running requests simpler.
     *
     * @param $method
     * @param $args
     * @return \Illuminate\Http\Response
     */
    public function __call($method, $args)
    {
        if (in_array($method, ['get', 'post', 'put', 'patch', 'delete']))
        {
            return $this->call($method, $args[0]);
        }

        throw new BadMethodCallException;
    }

    /**
     * Create a mock of a class as well as an instance.
     *
     * @param $class
     * @return \Mockery\MockInterface
     */
    public function mock($class)
    {
        $mock = Mockery::mock($class);

        $this->app->instance($class, $mock);

        return $mock;
    }

}

मेरा टेस्ट ऐसा कुछ दिखता है

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Artisan;

class CustomerRegistrationControllerTest extends TestCase
{

    use DatabaseMigrations;

    protected static $db_inited = false;

    protected static function initDB()
    {
        echo "\n---Customer Registration Controller Tests---\n"; // proof it only runs once per test TestCase class
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }

    public function setUp()
    {

        parent::setUp();

        if (!static::$db_inited) {
            static::$db_inited = true;
            static::initDB();
        }

//        $this->app->refreshApplication();
        $this->artisan('migrate:refresh');
        $this->seed();
        $this->seed('DatabaseSeeder');

        $this->initializeTests();

);

    }


    public function testSomething()

    {


        $this->Mock
            ->shouldReceive('destroy')
            ->with('1')
            ->andReturn();


        $this->RegistrationController->postRegistration();
//      $this->assertResponseStatus(200);

    }

}

बस इसे चलाएं:

    $this->artisan('migrate:refresh', [
        '--seed' => '1'
    ]);

डेटाबेस में परिवर्तनों से बचने के लिए परीक्षणों के बीच बने डेटाबेस परीक्षणों को अपने परीक्षणों के लिए use DatabaseTransactions जो use DatabaseTransactions को दबाते हैं।







seeding