2016-11-13 4 views
2

私はCakePHPのインポート/エクスポートデータベース用のプラグインを作成しています。このプラグインは、シェルを有し、そのindex()方法は、すでにエクスポートされたデータベースをリスト:なしデータベースとCakePHP:シェル上のテーブルの書き込みテスト

public function index() 
{ 
    //Gets alla files 
    $files = BackupManager::index(); 
    $this->out(__d('mysql_backup', 'Backup files found: {0}', count($files))); 
    if (!empty($files)) { 
     //Parses files 
     $files = array_map(function ($file) { 
      if (isset($file->compression) && !$file->compression) { 
       $file->compression = __d('mysql_backup', 'none'); 
      } 
      $file->size = Number::toReadableSize($file->size); 
      return array_values((array)$file); 
     }, $files); 
     //Table headers 
     $headers = [ 
      __d('mysql_backup', 'Filename'), 
      __d('mysql_backup', 'Extension'), 
      __d('mysql_backup', 'Compression'), 
      __d('mysql_backup', 'Size'), 
      __d('mysql_backup', 'Datetime'), 
     ]; 
     $this->helper('table')->output(array_merge([$headers], $files)); 
    } 
} 

出力:

$ bin/cake backup 

Welcome to CakePHP v3.3.8 Console 
--------------------------------------------------------------- 
App : src 
Path: /home/mirko/Server/mirkopagliai/src/ 
PHP : 7.0.12-1 
--------------------------------------------------------------- 
Backup files found: 0 

いくつかのデータベースを持つ出力:

$ bin/cake backup 

Welcome to CakePHP v3.3.8 Console 
--------------------------------------------------------------- 
App : src 
Path: /home/mirko/Server/mirkopagliai/src/ 
PHP : 7.0.12-1 
--------------------------------------------------------------- 
Backup files found: 2 
+-------------------------------------------+-----------+-------------+-----------+-----------------+ 
| Filename         | Extension | Compression | Size  | Datetime  | 
+-------------------------------------------+-----------+-------------+-----------+-----------------+ 
| backup_mirkopagliai_20161113110419.sql.gz | sql.gz | gzip  | 51,05 KB | 13/11/16, 11:04 | 
| backup_mirkopagliai_20161113110414.sql | sql  | none  | 150,93 KB | 13/11/16, 11:04 | 
+-------------------------------------------+-----------+-------------+-----------+-----------------+ 

を今私がする必要がありますいくつかのテストを書く。
はノーデータベース・コードのためのテストを書いた:

public function testIndexNoBackups() 
{ 
    $this->io->expects($this->once()) 
     ->method('out') 
     ->with('Backup files found: 0', 1); 
    $this->BackupShell->index(); 
} 

私の問題は、テーブル出力するかどうか(第2例)のテストを記述することです。今の

は、私はこれだけを書いた:

public function testIndex() 
{ 
    //Creates a database 
    (new BackupExport())->export(); 

    $this->io->expects($this->once()) 
     ->method('out') 
     ->with('Backup files found: 1', 1); 

    $this->BackupShell->index(); 
} 

出力:

$ phpunit tests/TestCase/Shell/BackupShellTest.php --filter testIndex 
PHPUnit 5.4.6 by Sebastian Bergmann and contributors. 

E.                 2/2 (100%) 

Time: 114 ms, Memory: 6.00MB 

There was 1 error: 

1) MysqlBackup\Test\TestCase\Shell\BackupShellTest::testIndex 
Error: Call to a member function output() on null 

/home/mirko/Libs/Plugins/cakephp-mysql-backup/src/Shell/BackupShell.php:110 
/home/mirko/Libs/Plugins/cakephp-mysql-backup/tests/TestCase/Shell/BackupShellTest.php:191 

ERRORS! 
Tests: 2, Assertions: 1, Errors: 1. 

だから、どのようにテーブルの出力を検査するためのテストを書くには?例はどこにありますか?

+1

常に(わずか4時間後に、あなたのリンクはすでに古くなっている)問題に関連するすべてのコードが含まれ、あなたのコードにリンクしないでください! – ndm

+0

ありがとう@ndm最初の投稿は固定 –

答えて

2

どのくらいきれいにしたいかによって異なります。 私は個人的にはスピードのため、主に出力の期待値を使用しません。この特別なConsoleOutputは、標準出力または標準エラー出力に書き込みますが、だけではなく、内部であなたがそれを取得するためにすべてを収集することはありません

php ... use Tools\TestSuite\ConsoleOutput; ... $this->out = new ConsoleOutput(); $this->err = new ConsoleOutput(); $io = new ConsoleIo($this->out, $this->err); $this->Shell = $this->getMockBuilder(InflectShell::class) ->setMethods(['in', '_stop']) ->setConstructorArgs([$io]) ->getMock();

代わりに、私はちょうど、コンテナの「擬似モック」親切で出力を集めますその後。

のコマンドを実行した後、あなたは、単に

php $output = $this->out->output(); $expected = 'foo-bar'; $this->assertContains($expected, $output);

を行うことができます詳細についてはtest cases in my tools pluginをチェックしてください。また、上記の例で必要となるツールを提供します。

+1

ありがとう@マーク。あなたは大きな助けをしてきました。私はあなたのプラグインを使用していませんが、あなたが提案したロジックが正しいと思われます。私は 'Cake \ TestSuite \ Stub \ ConsoleOutput'がほぼ同じように動作することを知りました(そうですか?)。それが十分であれば、今はそれを解決し、すぐにあなたのプラグインを試してみるでしょう –

0

@markのおかげです。私の解決策:$outputdebug()

... 
use Cake\TestSuite\Stub\ConsoleOutput; 
use Cake\Console\ConsoleIo; 
... 

class BackupShellTest extends TestCase 
{  
    public function setUp() 
    { 
     parent::setUp(); 

     $this->out = new ConsoleOutput();   

     $this->Shell = $this->getMockBuilder('MysqlBackup\Shell\BackupShell') 
      ->setMethods(['in', 'err', '_stop', 'clear']) 
      ->setConstructorArgs([new ConsoleIo($this->out)]) 
      ->getMock(); 
    } 

    public function testIndex() 
    { 
     $this->Shell->index(); 
     $output = $this->out->messages(); 

     //Some tests on $output HERE 
    } 
} 

例:

########## DEBUG ########## 
[ 
     (int) 0 => 'Backup files found: 3', 
     (int) 1 => '+----------------+-----------+-------------+-----------+--------------------+', 
     (int) 2 => '| <info>Filename</info>  | <info>Extension</info> | <info>Compression</info> | <info>Size</info>  | <info>Datetime</info>   |', 
     (int) 3 => '+----------------+-----------+-------------+-----------+--------------------+', 
     (int) 4 => '| backup.sql.gz | sql.gz | gzip  | 443 Bytes | 11/15/16, 11:45 AM |', 
     (int) 5 => '| backup.sql.bz2 | sql.bz2 | bzip2  | 523 Bytes | 11/15/16, 11:45 AM |', 
     (int) 6 => '| backup.sql  | sql  | none  | 1.23 KB | 11/15/16, 11:45 AM |', 
     (int) 7 => '+----------------+-----------+-------------+-----------+--------------------+' 
] 
########################### 
関連する問題