2016-01-29 5 views
11

में होता है, इसलिए मेरे पास "बनाएं" मान के साथ एक बटन वाला एक पृष्ठ है। जब मैं किसी भी फ़ील्ड को भरने के बिना उस बटन को क्लिक करता हूं, तो यह फ़ॉर्म को मान्य करता है और उसी पृष्ठ पर त्रुटि संदेशों को प्रदर्शित करता है। जब मैं ब्राउज़र में ऐसा करता हूं, तो यह ठीक काम करता है, लेकिन जब मैं इसे phpunit के साथ करता हूं, तो इसका अप्रत्याशित परिणाम होता है और मुझे नहीं पता कि क्यों।लार्वाल phpunit परीक्षण विफल रहा है। एक अप्रत्याशित पृष्ठ पर जा रहे हैं। केवल परीक्षण

यहाँ मेरी एकीकरण परीक्षण है:

public function testCreateValidation()          
{ 
    $this->visit(route('patients.indexes.create', $this->patient->id));  
    $this->press('Create');             
    $this->seePageIs(route('patients.indexes.create', $this->patient->id));    
} 

और यह परिणाम है:

There was 1 failure: 
1) Tests\Integration\IndexControllerTest::testCreateValidation 
Did not land on expected page [http://localhost/patients/69/indexes/create]. 

Failed asserting that two strings are equal. 
--- Expected 
+++ Actual 
@@ @@ 
-'http://localhost/patients/69/indexes/create' 
+'http://localhost/patients' 

/vagrant/vendor/laravel/framework/src/Illuminate/Foundation/Testing/InteractsWithPages.php:141 
/vagrant/tests/Integration/IndexControllerTest.php:51 

मुझे समझ नहीं आता क्यों यह patients पृष्ठ पर पुनः निर्देशित किया जा रहा है।

public function create($id)               
{                     
    $index = $this->indexes->newInstance();           
    $patient = $this->patients->findOrFail($id);          

    return view('patient.index.create', ['index' => $index, 'patient' => $patient]); 
} 

यहाँ और create देखने के प्रासंगिक अनुभाग है:

यहाँ Laravel create विधि है कि परीक्षण किया जा रहा है

<?= Form::open(['route' => array('patients.indexes.store', $patient->id), 'class' => 'form-horizontal']) ?> 
    @include('patient.index._form') 
    <?= Form::submit('Create', ['class' => 'btn btn-primary']) ?> 
<?= Form::close() ?> 

और अंत में store विधि है कि यह भेजा जा रहा है प्रति:

public function store(IndexRequest $request, $id)  
{              
    $index = $this->indexes->newInstance();    
    $index->fill($request->all());      
    $index->patient_id = $id;       
    $index->save();          

    $patient = $index->patient;       

    return redirect()->route('patients.edit', $patient); 
} 

मैं भी एक FormRequest उपयोग कर रहा हूँ इनपुट को मान्य करने के:

public function rules()     
{           
    return [        
     'index_title' => 'required',  
     'index_description' => 'required', 
    ];          
} 

तो अनिवार्य रूप से, क्योंकि यह IndexRequest में मान्यता विफल हो रहा है, IndexRequest इसे वापस patients.indexes.create दृश्य और प्रदर्शन त्रुटियों के लिए लात चाहिए। लेकिन कुछ कारणों से इसे मरीज़ पेज पर लाया जा रहा है (यह केवल परीक्षण में होता है, यदि मैं ब्राउज़र में मैन्युअल रूप से बनाएँ बटन पर क्लिक करके इसे आज़माता हूं, तो यह अपेक्षित काम करता है)

मुझे पहले यह समस्या है लेकिन इसे हल करने में कभी सक्षम नहीं हुआ है। कोई विचार?

+0

Laravel का कौन-सा संस्करण चल रहे हैं? – BrokenBinary

उत्तर

4

ऐसा लगता है कि आपके पास CSRF समस्याएं हैं। जब आप अपने ब्राउज़र में फॉर्म पर नेविगेट करते हैं, तो लैरावेल आपके ब्राउज़र की कुकीज़ में और अनुरोध हेडर में special token स्टोर करता है। फिर, जब आप फॉर्म जमा करते हैं तो यह सुनिश्चित करने के लिए कि आप फ़ॉर्म सबमिट कर रहे हैं, वह टोकन ढूंढता है।

जब आप PHPUnit के साथ परीक्षण करते हैं, तो टोकन नहीं भेजा जाता है, इसलिए आपको या तो इसे स्वयं भेजना होगा, या आपको टोकन के लिए जांचने वाले मिडलवेयर से अपने परीक्षण बहिष्कृत करना होगा। अपने परीक्षणों को छोड़कर आसान तरीका है।

लार्वेल 5.0 में मैंने विधि VerifyCsrfToken मिडलवेयर में ओवरराइड करके किया था।

class VerifyCsrfToken extends BaseVerifier { 
    // Override the handle() method in the BaseVerifier class 
    public function handle($request, Closure $next) { 
     // When the App environment is 'testing', skip CSRF validation. 
     if (app()->environment() === 'testing') { 
      return $next($request); 
     } 

     return parent::handle($request, $next); 
    } 
} 

डिफ़ॉल्ट रूप से, PHPUnit अपने Laravel साइट रूट में phpunit.xml फ़ाइल से वातावरण चर खींचती है। APP_ENV वैरिएबल वह है जो एप्लिकेशन पर्यावरण नाम को नियंत्रित करता है, और यह 'परीक्षण' पर डिफ़ॉल्ट होता है। यदि आपका अलग है, तो आपको उससे मेल खाने के लिए प्रदान किए गए कोड को बदलने की आवश्यकता है।

1

तो मिडलवेयर समस्या आप WithoutMiddleware विशेषता का उपयोग कर परीक्षण से निकाल सकते हैं वास्तव में है:

class IndexControllerTest extends TestCase 
{ 
    use Illuminate\Foundation\Testing\WithoutMiddleware; 
    ... 
संबंधित मुद्दे