2016-09-26 16 views
5

Tôi đang cố gắng chạy một số kiểm tra đơn vị cơ bản cho ứng dụng Laravel của tôi với PHPUnit.Laravel: PHPUnit gây 404 cho tất cả mọi thứ

Tuy nhiên, tất cả các yêu cầu HTTP trả về mã trạng thái HTTP không tìm thấy 404, vì vậy chúng tôi không thực hiện được rào cản đầu tiên.

Sau trawling internet, tôi đã tìm thấy thông tin về làm thế nào để khắc phục điều này, nhưng cho đến nay không ai trong số những thực sự làm việc:

  • Kiểm tra tôi đã tham khảo các tuyến đường được đặt tên một cách chính xác.
  • Kiểm tra xem tuyến đường này có phương pháp điều khiển hay không.
  • Kiểm tra xem nó có hoạt động trong trình duyệt hay không.
  • tôi đã chắc chắn rằng url ứng dụng của tôi được thiết lập một cách chính xác trong tất cả các nơi phải: TestCase::$baseUrl, Config->app->url ... bộ của nó để http://localhost/myappfolder
  • Tôi đã thử phương pháp khác nhau từ bên trong phương pháp thử nghiệm đơn vị của tôi để có được một phản ứng HTTP vật. Cho đến nay tất cả dẫn đến một 404: $this->route(), $this->action(), $this->call().
  • Tôi đã thử xóa tất cả các tham chiếu đến bảo vệ tuyến đường Middleware khỏi bộ điều khiển của tôi. Tôi tin rằng nó bị vô hiệu hóa khi chạy thử nghiệm đơn vị, nhưng tôi đã làm điều này khi tôi kéo tóc tục ngữ của tôi ra cố gắng để chẩn đoán vấn đề này. Không có hiệu lực.
  • Tệp gốc của ứng dụng của tôi có một số PHP require s bao gồm các tệp tuyến đường nhỏ hơn. Taylor Otwell đã nói trước rằng một tập tin tuyến đường như thế này, nhưng có chứa require_once có thể gây ra những lỗi 404 này. Anh đề nghị đổi thành require. Một số nhà phát triển báo cáo rằng điều này sửa lỗi cho họ, nhưng tôi đã chỉ được require tất cả cùng. Tôi cũng đã cố gắng di chuyển các tuyến đường trở lại vào các tập tin tuyến đường chính anyway, nhưng điều này đã không làm việc hoặc.

tra đã thường thường:

  • Nếu tôi chỉnh sửa các phương pháp route() trong Illuminate\Foundation\Testing\Concerns để in ra các URL nó tạo ra, nó là trong thực tế một cách hoàn hảo hình thành: http://localhost/myprojectfolder/route-url-text. Truy cập trang này trong trình duyệt hoạt động tốt. Truy cập nó với cURL cũng hoạt động. Chạy $this->call() trên URL đã được tạo và sau đó chạy PHPUnit hiển thị lại 404. Vì vậy, nó chỉ PHPUnit làm một cái gì đó kỳ lạ.

Đây là mã Tôi đang sử dụng trong kịch bản đơn vị kiểm tra:

public function testThis() 
{ 
    $response = $this->route('GET', 'myRouteName', [ 
     'myParam' => 5 
    ]); 
    dd($response->status()); // 404 - always! 
} 

nó muốn có cái gì đó bước vào và ném một cách rõ ràng 404 ... thực sự sẽ đánh giá cao nếu ai đó có thể làm sáng tỏ về điều này.

+0

Điều này có vẻ lạ, nhưng điều gì sẽ xảy ra nếu bạn gọi một tuyến đường khác ngay sau đó? Bạn có được 200 không? Tôi đã có một vấn đề tương tự trong quá khứ, nhưng không bao giờ tìm thấy một giải pháp – Aron

+0

Điều đó có vẻ lạ ... nhưng tôi đánh giá cao đề nghị. Tôi đã đặt một vài yêu cầu liên tiếp. Vẫn nhận được 404. – kohloth

+0

Ah xin lỗi tôi không thể giúp đỡ nhiều hơn nữa. Có thể đáng giá khi đăng sự cố này lên diễn đàn về ấu trùng – Aron

Trả lời

1

Sự cố được giải quyết. Tôi đã có điều này bên trong app/Providers/AppServiceProvider.php. Một cái gì đó để thêm vào hướng dẫn khắc phục sự cố phpunit tập thể!

public function boot() 
{ 
    URL::forceRootUrl(Config::get('app.url')); 
} 

Tôi đã thay đổi này để:

public function boot() 
{ 
    if (!defined('PHPUNIT_RUNNING')) { 
     URL::forceRootUrl(Config::get('app.url')); 
    } 
} 

Và đặt insite này phpunit.xml

<php> 
    <const name="PHPUNIT_RUNNING" value="true"/> 
</php> 
1

Laravel5.5 (vendor/laravel/framework/src/Illuminate bị/cơ sở/kiểm tra/Mối quan tâm/MakesHttpRequests.php)

public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) 
{ 
    $kernel = $this->app->make(HttpKernel::class); 
    $files = array_merge($files, $this->extractFilesFromDataArray($parameters)); 
    $symfonyRequest = SymfonyRequest::create(
     $this->prepareUrlForRequest($uri), $method, $parameters, 
     $cookies, $files, array_replace($this->serverVariables, $server), $content 
    ); 
    $response = $kernel->handle(
     $request = Request::createFromBase($symfonyRequest) 
    ); 
    if ($this->followRedirects) { 
     $response = $this->followRedirects($response); 
    } 
    $kernel->terminate($request, $response); 

    return $this->createTestResponse($response); 
} 

Rõ ràng là ấu trùng không gửi yêu cầu đến điều khiển từ xa:

$response = $kernel->handle(
    $request = Request::createFromBase($symfonyRequest) 
); 

Bạn nên sử dụng đồng lừa dối.

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