简体   繁体   English

哪种方法可以使用PHPUnit在Laravel 5.2中测试命令?

[英]Which is an acceptable approach for testing commands in Laravel 5.2 with PHPUnit?

I'm trying to write test cases for Commands in PHPUnit, without much success. 我试图在PHPUnit中为Commands编写测试用例,但没有成功。

At this point I've tried many things, being probably this post the closest approach I found for my purpose. 在这一点上,我已经尝试了很多事情,可能是这篇文章是我找到的最接近我目的的方法。 Still, I'm struggling a lot to get this working. 尽管如此,我仍在努力工作。

Follows an example output for you: 遵循为您提供的示例输出:

alariva@trinsic ~/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() 

You can find my current attempt here , (broken tests), but maybe you can hint me something I'm missing :) 您可以在这里找到我目前的尝试 ,(测试失败),但是也许您可以向我提示我所缺少的东西:)

Just for reference, how I'm doing right now but does not seem to cover the code: Coverage Report and Test Case 仅供参考,我现在正在做什么,但似乎没有涵盖以下代码: 覆盖率报告测试用例

Side Note: You may ask why PHPUnit and not another testing framework. 旁注:您可能会问为什么使用PHPUnit而不是另一个测试框架。 So far I'm generating my test coverage with PHPUnit and I'd like to stick to it until I feel the actual need to switch. 到目前为止,我正在用PHPUnit生成测试覆盖率,我一直坚持下去,直到我感觉到实际需要切换为止。 However, all suggestions are welcome. 但是,欢迎提出所有建议。

Thanks in advance! 提前致谢!

In above case, you should remove use Artisan; 在上述情况下,您应该删除use Artisan; because you don't use any namespace for your test 因为您不使用任何名称空间进行测试

I got to an acceptable approach as follows: 我得到了一种可接受的方法,如下所示:

<?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,
            ]);
    }
}


alariva@trinsic ~/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 参考

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM