2016-09-16 12 views
5

मैं एक एंडपॉइंट के लिए परीक्षण लिखने की कोशिश कर रहा हूं जो एक संलग्न CSV फ़ाइल के साथ एक पोस्ट अनुरोध की अपेक्षा करता है। मुझे इस तरह के पोस्ट अनुरोध को अनुकरण करना है:केकपीएचपी/phpunit: फ़ाइल अपलोड करने के लिए कैसे करें

$this->post('/foo/bar'); 

लेकिन मुझे यह नहीं पता कि फ़ाइल डेटा कैसे जोड़ना है। मैं मैन्युअल $_FILES सरणी स्थापित करने की कोशिश की, लेकिन यह काम नहीं किया ...

$_FILES = [ 
     'csvfile' => [ 
      'tmp_name' => '/home/path/to/tests/Fixture/csv/test.csv', 
      'name' => 'test.csv', 
      'type' => 'text/csv', 
      'size' => 335057, 
      'error' => 0, 
     ], 
]; 
$this->post('/foo/bar'); 

यह करने के लिए सही तरीका क्या है?

उत्तर

0

मैं जो कह सकता हूं उससे, केकेपीएचपी जादुई रूप से $_FILES, $_POST, आदि की सामग्री को जोड़ती है ताकि हम $this->request->data[...] से प्रत्येक तक पहुंच सकें। और अगर आप एक वैकल्पिक दूसरा पैरामीटर के साथ डेटा सरणी जानकारी पारित कर सकते हैं:

$data = [ 
     'csvfile' => [ 
      'tmp_name' => '/home/path/to/tests/Fixture/csv/test.csv', 
      'name' => 'test.csv', 
      'type' => 'text/csv', 
      'size' => 45, 
      'error' => 0, 
     ], 
]; 
$this->post('/foo/bar', $data); 
1

मजाक कोर PHP कार्यों थोड़ा मुश्किल है।

मुझे लगता है कि आपके पास अपने पोस्ट मॉडल में ऐसा कुछ है।

public function processFile($file) 
{ 
    if (is_uploaded_file($file)) { 
     //process the file 
     return true; 
    } 
    return false; 
} 

और आपके पास इसी तरह की एक परीक्षा है।

public function testProcessFile() 
{ 
    $actual = $this->Posts->processFile('noFile'); 
    $this->assertTrue($actual); 
} 

जैसा कि आप परीक्षण प्रक्रिया के दौरान कुछ भी अपलोड नहीं करते हैं, परीक्षण हमेशा असफल रहेगा।

आपको अपने PostsTableTest.php की शुरुआत में दूसरा नामस्थान जोड़ना चाहिए, यहां तक ​​कि एक फ़ाइल में अधिक नामस्थान भी खराब अभ्यास है।

<?php 
namespace { 
    // This allows us to configure the behavior of the "global mock" 
    // by changing its value you switch between the core PHP function and 
    // your implementation 
    $mockIsUploadedFile = false; 
} 

आपके पास घुंघराले ब्रैकेट प्रारूप में आपकी मूल नेमस्पेस घोषणा होनी चाहिए। http://www.apress.com/9781484212134

:

namespace App\Model\Table { 

और आप PHP में कोर विधि जोड़ सकते हैं

function is_uploaded_file() 
{ 
    global $mockIsUploadedFile; 
    if ($mockIsUploadedFile === true) { 
     return true; 
    } else { 
     return call_user_func_array('\is_uploaded_file',func_get_args()); 
    } 
} 

//other model methods 

} //this closes the second namespace declaration 

CakePHP इकाई परीक्षण यहां पर अधिक ओवरराइट किया जा करने के लिए

संबंधित मुद्दे

 संबंधित मुद्दे