2016-06-25 6 views
2

Ich versuche, Testfälle für Commands in PHPUnit zu schreiben, ohne viel Erfolg.Was ist ein akzeptabler Ansatz zum Testen von Befehlen in Laravel 5.2 mit PHPUnit?

An diesem Punkt habe ich viele Dinge ausprobiert, wahrscheinlich this post der engste Ansatz, den ich für meinen Zweck gefunden habe. Trotzdem, ich kämpfe sehr darum, dass das funktioniert.

Folgt ein Beispiel Ausgabe für Sie:

[email protected] ~/timegrid.io/app $ phpunit --filter=SendBusinessReportTest 
PHP Warning: The use statement with non-compound name 'Artisan' has no effect in /home/alariva/timegrid.io/app/tests/unit/Console/Commands/SendBusinessReportTest.php on line 4 
PHP Stack trace: 
PHP 1. {main}() /usr/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46 
PHP 3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:129 
PHP 4. PHPUnit_TextUI_Command->handleArguments() /usr/share/php/PHPUnit/TextUI/Command.php:138 
PHP 5. PHPUnit_Util_Configuration->getTestSuiteConfiguration() /usr/share/php/PHPUnit/TextUI/Command.php:657 
PHP 6. PHPUnit_Util_Configuration->getTestSuite() /usr/share/php/PHPUnit/Util/Configuration.php:789 
PHP 7. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/php/PHPUnit/Util/Configuration.php:873 
PHP 8. PHPUnit_Framework_TestSuite->addTestFile() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php:409 
PHP 9. PHPUnit_Util_Fileloader::checkAndLoad() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php:335 
PHP 10. PHPUnit_Util_Fileloader::load() /usr/share/php/PHPUnit/Util/Fileloader.php:76 
PHPUnit 4.8.26 by Sebastian Bergmann and contributors. 

PHP Fatal error: Call to undefined method App\Console\Kernel::resolve() in /home/alariva/timegrid.io/app/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php on line 217 
PHP Stack trace: 
PHP 1. {main}() /usr/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46 
PHP 3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:129 
PHP 4. PHPUnit_TextUI_TestRunner->doRun() /usr/share/php/PHPUnit/TextUI/Command.php:176 
PHP 5. PHPUnit_Framework_TestSuite->run() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:440 
PHP 6. PHPUnit_Framework_TestSuite->run() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php:747 
PHP 7. PHPUnit_Framework_TestCase->run() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php:747 
PHP 8. PHPUnit_Framework_TestResult->run() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestCase.php:724 
PHP 9. PHPUnit_Framework_TestCase->runBare() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestResult.php:612 
PHP 10. PHPUnit_Framework_TestCase->runTest() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestCase.php:768 
PHP 11. ReflectionMethod->invokeArgs() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestCase.php:909 
PHP 12. SendBusinessReportTest->it_tests_command() /home/alariva/timegrid.io/app/vendor/phpunit/phpunit/src/Framework/TestCase.php:909 
PHP 13. Illuminate\Support\Facades\Artisan::resolve() /home/alariva/timegrid.io/app/tests/unit/Console/Commands/SendBusinessReportTest.php:14 
PHP 14. Illuminate\Support\Facades\Facade::__callStatic() /home/alariva/timegrid.io/app/tests/unit/Console/Commands/SendBusinessReportTest.php:14 

    [Symfony\Component\Debug\Exception\FatalErrorException] 
    Call to undefined method App\Console\Kernel::resolve() 

Sie my current attempt here finden können, (gebrochene Tests), aber vielleicht können Sie mir etwas andeuten ich :) fehlt

nur als Referenz, wie ich bin in diesem Augenblick zu tun, aber scheint nicht, den Code zu decken: Coverage Report und Test Case

Side Hinweis: Sie fragen sich vielleicht, warum PHPUnit und nicht einen anderen Test-Framework. Bis jetzt erzeuge ich meine Testabdeckung mit PHPUnit und ich möchte mich daran halten, bis ich das tatsächliche Bedürfnis verspüre, umzuschalten. Alle Vorschläge sind jedoch willkommen.

Vielen Dank im Voraus!

Antwort

0

ich auf einen akzeptablen Ansatz bekam wie folgt:

<?php 

use App\Console\Commands\SendBusinessReport; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 
use Symfony\Component\Console\Application as ConsoleApplication; 
use Symfony\Component\Console\Tester\CommandTester; 
use Timegridio\Concierge\Models\Appointment; 

class SendBusinessReportTest extends TestCase 
{ 
    use DatabaseTransactions; 
    use CreateBusiness, CreateUser, CreateContact, CreateAppointment, CreateService, CreateVacancy; 

    /** @test */ 
    public function it_reports_to_all_businesses() 
    { 
     $this->arrangeFixture(); 

     // BEGIN Actual solution code 
     $application = new ConsoleApplication(); 

     $testedCommand = $this->app->make(SendBusinessReport::class); 
     $testedCommand->setLaravel(app()); 
     $application->add($testedCommand); 

     $command = $application->find('business:report'); 

     $commandTester = new CommandTester($command); 

     $commandTester->execute([ 
      'command' => $command->getName(), 
     ]); 
     // END Actual solution code 

     $this->assertRegExp('/Scanning all businesses../', $commandTester->getDisplay()); 
    } 

    /** 
    * Arrange Fixture. 
    * 
    * @return void 
    */ 
    protected function arrangeFixture() 
    { 
     $this->owner = $this->createUser(); 
     $this->issuer = $this->createUser(); 

     $this->business = $this->createBusiness(); 
     $this->business->owners()->save($this->owner); 

     $this->contact = $this->createContact(); 
     $this->contact->user()->associate($this->issuer); 

     $this->service = $this->makeService(); 
     $this->business->services()->save($this->service); 

     $this->vacancy = $this->makeVacancy(); 
     $this->vacancy->service()->associate($this->service); 

     $this->business->vacancies()->save($this->vacancy); 

     $appointment = $this->makeAppointment($this->business, $this->issuer, $this->contact, [ 
      'status' => Appointment::STATUS_CONFIRMED, 
      ]); 
    } 
} 


[email protected] ~/timegrid.io/app $ phpunit --filter=it_reports_to_all_businesses 
PHPUnit 5.4.6 by Sebastian Bergmann and contributors. 

.                 1/1 (100%) 

Time: 813 ms, Memory: 30.00MB 

OK (1 test, 1 assertion) 

Reference

0

In obigen Fall sollten Sie use Artisan; entfernen, weil Sie

für Ihren Test keinen Namespace verwenden
+0

Dank Marcin, aber es schien etwas mehr zu sein, als wir erwartet hatten. Ich habe als Referenz die Lösung angegeben, die ich bisher erreicht habe. – alariva