2015-10-12 16 views
10

Tôi đang viết kiểm tra cho ứng dụng Laravel của tôi bằng cách sử dụng thư viện Codeception. Tôi đang sử dụng các Laravel5 module, và có nó được cấu hình với cleanup có nghĩa là tất cả các thử nghiệm sẽ chạy bên trong một giao dịch cơ sở dữ liệu, để cơ sở dữ liệu thử nghiệm của tôi không được làm đầy với dữ liệu thử nghiệm.Thử nghiệm một tuyến đường Laravel 5 với quy tắc tồn tại qua Codeception

Một trong những thiết bị đầu cuối tôi là thử nghiệm có quy tắc xác nhận sau thiết lập chống lại nó qua yêu cầu Mẫu:

public function rules() 
{ 
    return ['user_id' => 'required|exists:users,id']; 
} 

Các thử nghiệm mà tôi đã viết để POST để endpoint này như sau:

public function store(ApiTester $I) 
{ 
    // Create a couple of users 
    $users = factory(\App\Models\User::class, 2)->create(); 

    $I->wantTo('ask someone to be my friend'); 
    $I->authenticateAs($users[0]); 
    $I->sendPOST('users/' . $users[0]->id . '/friendships', [ 
     'user_id' => $users[1]->id 
    ]); 
    $I->seeResponseCodeIs(201); 
} 

Kiểm tra này luôn không thành công. Sau khi điều tra, tôi có thể thấy rằng nó không thành công vì yêu cầu không xác thực do quy tắc exists:users,id. Nếu tôi thay đổi các thiết lập Codeception để không thực thi các kiểm tra bên trong một giao dịch, trình duyệt tính hợp lệ của Laravel có thể nhìn thấy sự tồn tại của người dùng mà tôi đã tạo khi bắt đầu bài kiểm tra của tôi và bài kiểm tra đã qua. Vì vậy, câu hỏi của tôi là, có cách nào để tôi có thể duy trì hành vi gói mỗi bài kiểm tra trong một giao dịch cơ sở dữ liệu hay không, và trình xác nhận của Laravel có thể xem các bản ghi mà tôi tạo trong các bài kiểm tra của tôi không? Không.

+0

Tôi có cùng một vấn đề chính xác bất kỳ trợ giúp nào sẽ được đánh giá cao – Fabrizio

+0

Bạn có thể thêm cấu hình bộ cho câu hỏi của mình không? – Naktibalda

Trả lời

4

Vấn đề là, nếu giao dịch không được cam kết, dữ liệu gốc trong bảng cơ sở dữ liệu sẽ không bị ảnh hưởng. Vì vậy, trong giao dịch, bạn tạo hai người dùng, nhưng không có tuyên bố cam kết nào sẽ tồn tại với cơ sở dữ liệu của bạn. Do đó quy tắc xác thực laravel 'tồn tại' không thể tìm thấy chúng (quy tắc đó làm cho một yêu cầu cơ sở dữ liệu để tìm user_id cụ thể).

Vì vậy, trong trường hợp của bạn, người dùng phải tồn tại trước khi thử nghiệm. Thay vào đó, tôi khuyên bạn nên sử dụng Di chuyển. Resetting Database after each test

Tạo bảng của bạn với di chuyển cơ sở dữ liệu và hạt giống và cuộn chúng trở lại sau khi thử nghiệm kết thúc.

+0

Tôi đã hy vọng có thể tránh di chuyển cơ sở dữ liệu của mình trước mỗi lần kiểm tra. Có vẻ như điều đó sẽ có một hình phạt hiệu suất cao so với thực hiện bên trong một giao dịch. Những gì tôi không thực sự hiểu là làm thế nào trình duyệt tính hợp lệ của Laravel không thể nhìn thấy những người dùng mà tôi đã tạo ra, là Laravel và Codeception sử dụng hai kết nối cơ sở dữ liệu khác nhau? –

0

Trích:

$I->sendPOST('users/' . $users[0]->id . '/friendships', [ 
    'user_id' => $users[1]->id 
]); 

Tại sao các bạn gửi $users[0]->id trong url yêu cầu và sau đó 'user_id' => $users[1]->id trong các thông số?

Đây có phải là vấn đề của bạn không? Đây có phải là lý do bạn không thực hiện được xác nhận không?

+0

Đây không phải là vấn đề. Điểm cuối này chấp nhận ID người dùng của * người dùng * khác mà bạn đang yêu cầu kết bạn. –

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