2013-10-30 17 views
5

Tôi đang cố gắng sử dụng Codeception để chạy thử nghiệm đơn vị Laravel 4 của mình.Thử nghiệm đơn vị mẫu thử Laravel 4 với Codeception - Class 'Eloquent' không được tìm thấy

Chạy thử nghiệm cho một lớp đơn giản mà không có phụ thuộc nào hoạt động tốt. Nhưng khi tôi khởi tạo một mô hình phụ thuộc vào Eloquent, tôi nhận được lỗi nghiêm trọng này:

PHP Lỗi nghiêm trọng: Lớp 'Eloquent' không được tìm thấy trong /var/www/project/app/models/Role.php trên dòng 4

Đơn vị kiểm tra:

<?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); 
    } 
} 

mẫu:

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

dự án:

Tôi đang chạy vendor/bin/codecept chạy đơn vị từ gốc dự án, với cấu trúc tập tin này:

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

Tôi đang làm gì sai?

+1

Tôi không biết về codeception đặc biệt, nhưng với PHPUnit, bạn cần ít nhất [khởi động tự động tải lớp] (https://github.com/laravel/laravel/blob/master/phpunit.xml#L4). Có lẽ nó giống với Codeception. – fideloper

+0

Tôi biết điều này là điên muộn nhưng sau khi bạn cài đặt gói nhà soạn nhạc. Bạn gõ vào thư mục gốc của trang. "vendor/bin/codecept _bootstrap" và điều đó sẽ tạo tệp cho bạn. – John

Trả lời

8

Bằng cách nhìn vào Codeception L4 sample app, tôi đã có thể tham khảo cách bootstrap các autoload để giải quyết vấn đề này, bằng cách thêm những dòng này vào dự án /app/kiểm tra/_boostrap.php:

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

chỉnh sửa: khi nâng cấp từ Laravel 4,0-4,1, nó cũng cần thiết phải thêm một dòng thêm:

$app->boot(); 
+0

hãy cẩn thận với bao gồm PATH! – Chung

3

tôi lẽ muộn để đảng, nhưng nếu bạn không cần codecept đồ đạc. Bạn nên mở rộng triển khai thực hiện của laravel của PHPUnit_Framework_TestCase gọi là TestCase. Như thế này:

class TestModel extends TestCase { 
} 
0

Không thể tìm thấy lớp Eloquent khi bạn đang chạy thử nghiệm đơn vị của mình.

Thử thêm use Illuminate\Database\Eloquent\Model as Eloquent; vào Role.php.

0

Bạn có thể vào lớp TestCase và phương pháp ghi đè refreshApplication (thêm phương pháp để TestCase) với việc thêm auth hoặc một số:

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

Câu trả lời cho câu hỏi này là một chút lỗi thời bây giờ. Với Laravel 5 Tôi gặp lỗi tương tự (Lớp 'Eloquent' không được tìm thấy ...) và giải quyết bằng cách sao chép mã từ Laravels base TestCase.php file. Tập tin này được sử dụng để thử nghiệm trong khuôn khổ Laravel (KHÔNG sử dụng codeception).

Để khắc phục lỗi 'Eloquent not found', hãy thêm các dòng sau vào project/tests/unit/_bootstrap.php

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

Thành thật mà nói, tôi không chắc chắn lý do tại sao nó hoạt động! Tôi sẽ chỉnh sửa nếu tôi tìm ra lý do tại sao hoặc ai đó nhận xét.

0

tôi giải quyết một vấn đề tương tự với Laravel 4 và Codeception bằng cách thêm các dòng sau vào _bootstrap.php

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

Hope this helps một googler đồng!

Các vấn đề liên quan