Skip to content

Instantly share code, notes, and snippets.

@laracasts
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save laracasts/3c306e764be369ece23e to your computer and use it in GitHub Desktop.
Save laracasts/3c306e764be369ece23e to your computer and use it in GitHub Desktop.
I want an acceptance test for an Artisan command that generates some files with boilerplate. However, this command is part of a Composer package. I'm trying to figure out the best way to actually call Artisan from the package. Right now, I'm just assuming the framework and doing ../../../artisan. Is there an alternative/better way that you'd sug…
<?php
$saveDir = './tests/acceptance/tmp';
$stubDir = './tests/acceptance/stubs';
$commandToGenerate = 'FooCommand';
$I = new AcceptanceTester($scenario);
$I->wantTo('generate a command and handler class');
// Is there a better way to call the Artisan command? Without having to expect the framework and do ../../../?
$I->runShellCommand("php ../../../artisan commander:generate $commandToGenerate --properties='bar, baz' --base='$saveDir'");
$I->seeInShellOutput('All done!');
// My Command stub should match the generated class.
$I->openFile("{$saveDir}/{$commandToGenerate}.php");
$I->seeFileContentsEqual(file_get_contents("{$stubDir}/{$commandToGenerate}.stub"));
// And my CommandHandler stub should match its generated counterpart, as well.
$I->openFile("{$saveDir}/{$commandToGenerate}Handler.php");
$I->seeFileContentsEqual(file_get_contents("{$stubDir}/{$commandToGenerate}Handler.stub"));
$I->cleanDir($saveDir);
@hoopyfrood
Copy link

It won't be long: laravel/laravel#2218. I'd wait, if you can't, I'm afraid the ../../../ is the best way. Good luck!

@DavertMik
Copy link

I'd create a runArtisanCommand method in AcceptanceHelper to execute artisan commands.
To match root directory you can use codecept_root_dir function

modules:
      enabled: ArtisanHelper
<?php
class ArtisanHelper extends \Codeception\Module
{
     function runArtisanCommand($command)
     {
          chdir(codecept_root_dir());
          $this->getModule('Cli')->runShellCommand("php artisan $command");     
     }
}

If codecept_root_dir is not what you need you can use ../../../ inside of runArtisanCommand
Abyway that would be less ugly than using ../../ inside of tests

@umang-ranium
Copy link

@DavertMik codeception already has a function callArtisan how to check out put of it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment