2013-10-30 10 views
5

Ich versuche Codeception zu verwenden, um meine Laravel 4 Komponententests auszuführen.Laravel 4 Modelleinheit Test mit Codeception - Klasse 'Eloquent' nicht gefunden

Das Ausführen eines Tests für eine einfache Klasse ohne Abhängigkeiten funktioniert einwandfrei. Aber wenn ich ein Modell instanziiere, das von Eloquent abhängt, erhalte ich diesen fatalen Fehler:

PHP Schwerwiegender Fehler: Klasse 'Eloquent' nicht gefunden in /var/www/project/app/models/Role.php on line 4

Unit-Test:

<?php 
use Codeception\Util\Stub; 
class TestModel extends \Codeception\TestCase\Test 
{ 
    public function testExample() 
    { 
    $role = new Role; 
    $role->name = 'superuser'; 
    $this->assertEquals('superuser', $role->name); 
    } 
} 

Modell:

<?php 
class Role extends Eloquent 
{ 
    public function users() 
    { 
    return $this->belongsToMany('User'); 
    } 
} 

Projektstruktur:

Ich bin Verkäufer/bin/codecept Laufeinheit aus dem Projektstamm, mit dieser Dateistruktur ausgeführt wird:

/project 
    codeception.yml 
    /vendor/bin/codecept 
    /app 
    /tests 
     unit.suite.yml 
     /unit 
     ExampleTest.php 
    /models 
     Role.php 
       ...etc 

Was mache ich falsch?

+1

Ich weiß nicht besonders über codeception, aber mit PHPUnit müssen Sie mindestens [Bootstrap der Klasse Autoloading] (https://github.com/laravel/laravel/blob/master/phpunit.xml#L4). Vielleicht ist es bei Codeception genauso. – fideloper

+0

Ich weiß, das ist spät verrückt, aber nachdem Sie das Composer-Paket installieren. Sie geben das Stammverzeichnis der Site ein. "vendor/bin/codecept _bootstrap" und das wird die Datei für Sie generieren. – John

Antwort

8

Mit am Codeception L4 sample app suchen, konnte ich sehen, wie die Autoload Bootstrap dieses Problem zu beheben, indem Sie die folgenden Zeilen in Projekt/app Hinzufügen/Tests/_boostrap.php:

include __DIR__.'/../../vendor/autoload.php'; 
$app = require_once __DIR__.'/../../bootstrap/start.php'; 
\Codeception\Util\Autoload::registerSuffix('Page', __DIR__.DIRECTORY_SEPARATOR.'_pages'); 

edit:, wenn sie von Laravel 4,0-4,1 aktualisieren, ist es auch notwendig, eine zusätzliche Zeile hinzufügen:

$app->boot(); 
+0

Vorsicht mit PATH! – Chung

3

ich bin wahrscheinlich spät zur Party, aber wenn Sie brauchen nicht die codecept Sachen. Sie sollten Laravels Implementierung von PHPUnit_Framework_TestCase erweitern, die nur TestCase genannt wird. Wie folgt aus:

class TestModel extends TestCase { 
} 
0

Die Eloquent Klasse kann nicht gefunden werden, wenn Sie Ihre Unit-Tests ausgeführt werden.

Versuchen Sie, use Illuminate\Database\Eloquent\Model as Eloquent; zu Role.php hinzuzufügen.

0

Sie können zu Testcase-Klasse gehen und überschreiben Methode refreshApplication (Add-Methode Testcase) mit Auth oder einige Zusatz:

protected function refreshApplication() 
{ 
    $this->app = $this->createApplication(); 

    $this->client = $this->createClient(); 

    $this->app->setRequestForConsoleEnvironment(); 

    $this->app->boot(); 

    // authenticate your user here, when app is ready 
    $user = new User(array('username' => 'John', 'password' => 'test')); 
    $this->be($user); 
} 
3

Die Antwort auf diese Frage ist jetzt ein wenig veraltet. Mit Laravel 5 Ich habe den gleichen Fehler (Klasse 'Eloquent' nicht gefunden ...) und löste es durch Kopieren des Codes von Laravels Basis TestCase.php file. Diese Datei wird zum Testen innerhalb des Laravel-Frameworks verwendet (KEINE Codeception).

Um den Fehler 'Eloquent not found' zu beheben, fügen Sie die folgenden Zeilen zu project/tests/unit/_bootstrap.php

<?php 
$app = require __DIR__.'/../../bootstrap/app.php'; 
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); 

Ehrlich gesagt bin ich nicht sicher, warum es funktioniert, aber es funktioniert! Ich werde bearbeiten, wenn ich herausfinden, warum oder jemand kommentiert.

0

Ich löste ein ähnliches Problem mit Laravel 4 und Codeception indem Sie die folgenden Zeilen hinzufügen zu _bootstrap.php

$app = require __DIR__.'/../../bootstrap/start.php'; $app->boot();

Hope this einen Gefährten googler hilft!

Verwandte Themen