2015-01-29 11 views
5

का उपयोग करते समय "क्लास 'एलोक्वेंट' नहीं मिला" मैं लैरवेल ऐप में @dataProvider का उपयोग करके PHPUnit के साथ यूनिट परीक्षण लिखते समय एक समस्या में भाग रहा हूं। त्रुटि मैं प्राप्त कर रहा हूँ है:PHPUnit: @dataProvider

PHP Fatal error: Class 'Eloquent' not found in /path/to/project/app/models/ExampleClass.php on line 7

यह dataProvider में इस्तेमाल घातक खड़ी कर रहा है निरंतर तरह दिखता है।

composer.json:

"psr-4": { 
    "Acme\\Models\\": "app/models" 
} 

phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit backupGlobals="false" 
     backupStaticAttributes="false" 
     bootstrap="bootstrap/autoload.php" 
     colors="true" 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     processIsolation="false" 
     stopOnFailure="false" 
     syntaxCheck="false" 
> 
    <testsuites> 
     <testsuite name="Application Test Suite"> 
      <directory>./app/tests/</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

उदाहरण मॉडल:

<?php 
namespace Acme\Models; 

use Eloquent; 

class ExampleClass extends Eloquent 
{ 
    /** 
    * @var bool 
    */ 
    const TRUE = true; 
} 

उदाहरण परीक्षण वर्ग:

<?php 

use Acme\Models\ExampleClass; 

class ExampleClassTest extends TestCase 
{ 
    /** 
    * Example test. 
    * 
    * @param int $value 
    * @return void 
    * @dataProvider testExampleTestDataProvider 
    */ 
    public function testExampleTest($value) 
    { 
     $this->assertTrue($value); 
    } 

    /** 
    * Data provider for testExampleTest. 
    * 
    * @return array 
    */ 
    public function testExampleTestDataProvider() 
    { 
     return array(
      array(ExampleClass::TRUE), 
     ); 
    } 
} 

स्टैक ट्रेस: ​​

PHP Stack trace: 
PHP 1. {main}() /usr/local/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() /usr/local/bin/phpunit:612 
PHP 3. PHPUnit_TextUI_Command->run() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:138 
PHP 4. PHPUnit_TextUI_Command->handleArguments() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:148 
PHP 5. PHPUnit_Util_Configuration->getTestSuiteConfiguration() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:696 
PHP 6. PHPUnit_Util_Configuration->getTestSuite() phar:///usr/local/bin/phpunit/phpunit/Util/Configuration.php:837 
PHP 7. PHPUnit_Framework_TestSuite->addTestFiles() phar:///usr/local/bin/phpunit/phpunit/Util/Configuration.php:924 
PHP 8. PHPUnit_Framework_TestSuite->addTestFile() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:400 
PHP 9. PHPUnit_Framework_TestSuite->addTestSuite() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:374 
PHP 10. PHPUnit_Framework_TestSuite->__construct() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:289 
PHP 11. PHPUnit_Framework_TestSuite->addTestMethod() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:188 
PHP 12. PHPUnit_Framework_TestSuite::createTest() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:842 
PHP 13. PHPUnit_Util_Test::getProvidedData() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:465 
PHP 14. ReflectionMethod->invoke() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:392 
PHP 15. ExampleClassTest->testExampleTestDataProvider() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:392 
PHP 16. spl_autoload_call() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:27 
PHP 17. Composer\Autoload\ClassLoader->loadClass() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:0 
PHP 18. Composer\Autoload\includeFile() /path/to/project/vendor/composer/ClassLoader.php:278 
PHP 19. include() /path/to/project/vendor/composer/ClassLoader.php:386 
+0

'\ Eloquent का उपयोग करने' का प्रयास करें; इसके बजाए। कुछ PHP बिल्डों को रूट नेमस्पेस पर इंगित करने की आवश्यकता है। – Dencker

+0

@ डेन्कर, नहीं जो मदद नहीं करता है। ** संपादित करें **: और न ही 'उपयोग का उपयोग करें' को हटा रहा है, और 'वर्ग उदाहरण क्लास का उपयोग करके \ Eloquent' बढ़ाता है। – JudRoman

उत्तर

7

मैं इस सटीक समस्या आ रही है। इसे इस तथ्य के साथ करना है कि लैरवेल उपनाम (उदा। Config::, Log:: ...) उस समय लोड नहीं किया गया है जब @dataProvider विधि कहा जाता है। यहां दो समाधान हैं जिन्हें मैं यहां सोच सकता हूं।

समाधान 1

संशोधित अपने @dataProvider इतना है कि यह मॉडल वर्ग का उपयोग नहीं करता। मेरे मामले में, मैं @dataProvider विधि में मॉडल वस्तुओं का निर्माण कर रहा, इस तरह:

public function people() { 
    $person1 = new Person(); 
    $person1->name = "me"; 

    $person2 = new Person(); 
    $person2->name = "you"; 

    return [$person1, $person2]; 
} 

के बाद से Person वर्ग @dataProvider विधि में संदर्भित है, यह उस वर्ग लोड करने के लिए प्रयास करने के लिए जा रहा है। फिर यह असफल हो जाएगा क्योंकि Eloquent क्लास उपनाम अभी तक लार्वेल द्वारा नहीं बनाया गया है।

इस के आसपास पाने के लिए, मैं सिर्फ डेटा वापस सकता है, और परीक्षण अपने आप में वास्तविक मॉडल वस्तुओं को बनाने:

public function people() { 
    return ["me", "you"]; 
} 

public function testPerson($name) { 
    $person = new Person(); 
    $person->name = $name; 

    // Assertions... 
} 

आपके मामले में, कि [[ExampleClass::TRUE]] के बजाय, [['true']] लौटने का मतलब होगा।

समाधान 2

मैं कोई बाध्यकारी कारण यहां Eloquent वर्ग अन्य नाम का उपयोग करने के लिए देखते हैं। असल में, मुझे नहीं पता कि यह बिल्कुल क्यों मौजूद है (सिवाय इसके कि यह "बेहतर" दिखता है?)। मैंने इसे आईआरसी चैनल में लाया, और प्रतिक्रिया नहीं मिली ... इसलिए अगर उपनाम का उपयोग करने का कोई कारण है, तो मुझे यह नहीं पता।

यह कहा गया है कि, यदि आपकी मॉडल कक्षा Eloquent उपनाम के बजाय अंतर्निहित \Illuminate\Database\Eloquent\Model कक्षा को विस्तारित करती है, तो आपके परीक्षण इस तरह काम करना शुरू कर देंगे।

<?php 
namespace Acme\Models; 

use \Illuminate\Database\Eloquent\Model; 

class ExampleClass extends Model 
{ 
    /** 
    * @var bool 
    */ 
    const TRUE = true; 
} 
+0

मैंने मूल रूप से यहां प्रश्न पोस्ट करने से पहले अपने "समाधान 1" को लागू किया है, लेकिन मुझे "समाधान 2" बेहतर पसंद है। – JudRoman

+1

समाधान 2 बेहतर! धन्यवाद! – klay

-3

आपको पहले ऑटोलोडर को शामिल करने की आवश्यकता है।

कुछ की तरह:

require __DIR__.'/../vendor/autoload.php'; 

PHPUnit आप के लिए अपने autoloader लोड नहीं करता है।

+1

क्या यह नहीं है कि 'bootstrap = "bootstrap/autoload.php" 'phpunit.xml' में है? उस फ़ाइल को '__DIR __' की आवश्यकता होती है।/../विक्रेता/autoload.php '; ' – JudRoman

+0

आप सही हैं, मुझे याद आया। –