Test delle unità eloquente al di fuori di Laravel

6

Come posso testare i miei modelli Eloquent quando sto usando l'ORM al di fuori di Laravel? Quello che spero di fare è eseguire test su ciascun modello, ma in qualche modo simulare l'oggetto database connection / query / builder (?).

Di seguito c'è qualcosa di simile a quello che sto cercando di fare:

$capsule = new Capsule; 

$capsule->addConnection(array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'mydb',
    'username'  => 'dbuser',
    'password'  => 'badpass',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => ''
));

$capsule->bootEloquent();

Di seguito è riportato il mio modello:

<?php

use Illuminate\Database\Eloquent\Model as Eloquent;

class Users extends Eloquent
{
    public function myCustomFind($id)
    {
        // .. lots of various checks before find() ...

        return $this->find($id);
    }
}

Poi, nei miei test unitari, posso fare quanto segue (non una versione funzionante, ma spero che tu possa vedere cosa spero di fare):

$mockSomething->expects($this->once)
    ->method('find')
    ->with(1);

$users = new Users();
$users->setSomething($mockSomething);

$user = $users->myCustomFind(1);

... Non ho idea di come farlo senza una completa integrazione (i dati vengono scritti nel database). Voglio solo testare i miei modelli, non l'ORM, inoltre i miei test sono veloci e solo il controllo dei parametri corretti vengono passati al generatore di query e il mio metodo gestisce correttamente i dati risultanti. Will Eloquent permettere questo? Ho notato che Laravel ha la sua classe di TestCase ma da quello che vedo si rivolge a tutti gli aspetti dei test in Laravel (controller, ecc.)

Se Eloquent non è una buona scelta per i test unitari al di fuori di Laravel, ci sono ORM popolari che possono? Non ho passato molto tempo con altri come Doctrine o Propel per sapere di cosa sono capaci in questo senso. Gradirei qualsiasi consiglio.

    
posta Martyn 13.02.2015 - 03:52
fonte

1 risposta

3

Probabilmente vorrai testare una classe che usa un modello eloquente piuttosto che il modello stesso.

Per creare un database in memoria per eloquenza su cui eseguire una query nel test, devi creare un database e quindi creare le tabelle in esso con alcuni dati da testare.

use MyNamespace\ClassToTest;
use MyNamespace\Models\MyModel;
use Illuminate\Database\Capsule\Manager as DB;

class ExampleTest extends PHPUnit_Framework_TestCase
{

    public function setUp()
    {
        $this->configureDatabase();
        $this->migrateIdentitiesTable();
    }
    protected function configureDatabase()
    {
        $db = new DB;
        $db->addConnection(array(
            'driver'    => 'sqlite',
            'database'  => ':memory:',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ));
        $db->bootEloquent();
        $db->setAsGlobal();
    }

    public function migrateIdentitiesTable()
    {
        DB::schema()->create('my_table', function($table) {
            $table->increments('id');
            $table->integer('page_id');
            $table->timestamps();
        });
        MyModel::create(array('page_id' => 1));
        MyModel::create(array('page_id' => 2));

    }

    public function testExtract()
    {
        $extractor = new ClassToTest();
        $result = $extractor->someFunctionThatUsesAnEloquentModel(1);
        $expected = array(
            'id' => '1',
            'page_id' => '1'
        );
        $this->assertEquals($expected['page_id'], $result['page_id']);
    }

}
    
risposta data 17.11.2015 - 22:24
fonte

Leggi altre domande sui tag