2015-07-06 18 views
12

Tôi đang viết một số xét nghiệm đơn vị để kiểm tra các điểm cuối API trong ứng dụng Laravel 5 của tôi và rất nhiều điểm cuối yêu cầu xác thực người dùng. Thay vì có cùng mã tạo tài khoản người dùng trong mọi thử nghiệm, tôi muốn xác định một đặc điểm RegistersUsers để sử dụng trên các lớp thử nghiệm, sẽ có phương thức registerUser().Trait không được tìm thấy trong các thử nghiệm đơn vị Laravel 5

Cấu trúc thư mục của thư mục tests của tôi là như vậy:

/tests 
    /Traits 
     RegistersUsers.php 
    TestCase.php 
    UserTest.php 

Tôi đã namespaced TestCase.phpUserTest.php bằng cách thêm khai namespace này:

namespace MyappTests; 

và tôi đã namespaced RegistersUsers.php như vậy :

namespace MyappTests\Traits; 

My UserTest trông giống như thế này, với không gian tên và khai báo use để tôi có thể tận dụng RegistersUsers.

<?php 

namespace MyappTests; 

use MyappTests\Traits\RegistersUsers; 

class UserTest extends TestCase 
{ 
    use RegistersUsers; 

    // ... rest of the class 

Tuy nhiên, khi tôi chạy thử nghiệm, PHPUnit chết với lỗi nghiêm trọng:

Trait 'MyappTests\Traits\RegistersUsers' not found in /home/vagrant/demo-app-net/tests/UserTest.php on line 9

Theo như tôi có thể nói, không gian tên của tôi là chính xác và đặc điểm của tôi nên được tìm thấy. Tôi đã đi xung quanh trong vòng tròn với điều này và dường như không thể tìm ra nó.

Trả lời

15

Tôi đoán có đặc điểm trong thư mục đặc điểm, đặc điểm không còn được tính trong trình tự động tải của bạn.

Để sửa lỗi này, bạn nên mở ra composer.json, tìm sectionfor autoload-dev và thay đổi nó thành một cái gì đó như sau ...

"autoload-dev": { 
    "classmap": [ 
     "tests/TestCase.php", 
     "tests/Traits/" 
    ] 
}, 

Và đó nên thêm bất kỳ đặc điểm mà bạn có trong thư mục đó để bộ nạp.

Sửa

Một số ý tưởng bổ sung đã được đưa lên trong các ý kiến. Nếu bạn sẽ duy trì cấu trúc thư mục/không gian tên thích hợp, bạn nên sử dụng tính năng tự động nạp psr-4 thay vì duy trì bản đồ lớp.

"autoload-dev": { 
    "psr-4": { 
     "MyappTests\\": "tests/" 
    } 
}, 

Ngoài ra, chứ không phải là đặt logic trong một đặc điểm để đăng ký một người dùng để sử dụng với thử nghiệm, khi bạn mở rộng TestCase, nó mang lại một phương pháp helper để đăng nhập như một người dùng nhất định. Bạn sẽ sử dụng nó như vậy ...

$user = User::find($id); 
$this->be($user); 
+0

Đó chính xác là vấn đề, tôi cho rằng nó sẽ tự động được chọn! Cảm ơn bạn! –

+1

Hoặc sử dụng psr4, sẽ tìm thấy không gian tên Traits của bạn. – OIS

+0

Thay đổi trên sẽ giúp giải quyết lỗi, nhưng giải pháp tốt hơn IMO là sử dụng Codeception để viết các bài kiểm tra thay vì PHPUnit trực tiếp - nó chứa rất nhiều phương thức trợ giúp để thử nghiệm các ứng dụng Laravel thực sự dễ dàng. Bao gồm ví dụ Phương thức $ I-> amLoggedAs() sẽ xác thực người dùng của bạn. Xem http://codeception.com/docs/modules/Laravel5 để biết thêm chi tiết. –

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