5

作成中の CakePHP シェルの単体テストを書きたいのですが、テストのドキュメントやベイクには記載されていません。

---------------------------------------------------------------
Bake Tests
Path: /home/brad/sites/farmlogs/app/Test/
---------------------------------------------------------------
---------------------------------------------------------------
Select an object type:
---------------------------------------------------------------
1. Model
2. Controller
3. Component
4. Behavior
5. Helper
Enter the type of object to bake a test for or (q)uit (1/2/3/4/5/q) 

CakePHP にはデフォルトのシェル テスト設定がないように見えるので、私の基本的なシェル テストの構造はどのように見えるべきでしょうか?

4

2 に答える 2

6

Mark Story のAssetCompressと CakeDC のMigrationsの例から判断すると、他のテストのディレクトリ構造を模倣するだけです。

Test/
  Case/
    Console/
      Command/
        Task/
          MyShellTaskTest.php
        MyShellTest.php

テストは、他の一般的なテストと同様に、CakeTestCase オブジェクトを拡張するだけです。

class MyShellTest extends CakeTestCase {
}

必要に応じて、Controller テストの場合と同様に、ベース シェルをオーバーライドできます。

class TestMyShell extends MyShell {
}

特別なことは何もありません。慣習に従ってください。

于 2012-09-18T16:13:37.097 に答える
1

app/lib/lib/Cake/Console/Command/TestShellTest.php が参考になると思います。

1. app/Test/Case/Console/Command/yourfile.php にファイルを作成しApp::uses('your class', 'relative path').
、次の例を使用してクラスを記述します。

App::uses('yourShellClass', 'Console/Command');
App::uses('ShellDispatcher', 'Console');
App::uses('Shell', 'Console');

2. シェル クラス A からモック クラス B を作成します。その関数は、クラス A で返されるデータを使用します。例:

 class TestYourShellClass extends YourShellClass {
         public function F1 ($parms){
               //if you need use database here, you can 
               //$this->yourModel = ClassRegistry::init('yourModel');
               return $this->_F1($parms);      
         }

    }

3、クラスAのテストクラスを書きます。起動時に初期化する必要があります。例えば:

 class YourShellClassTest extends CakeTestCase {
        public function setUp()
        {
            parent::setUp();
            $out = $this->getMock('ConsoleOutput', [], [], '', false);
            $in = $this->getMock('ConsoleInput', [], [], '', false);
            $this->Shell = $this->getMock(
                // this is your class B, which mocks class A.
                'TestYourShellClass',
                ['in', 'out', 'hr', 'help', 'error', 'err', '_stop', 'initialize', '_run', 'clear'],
                [$out, $out, $in]
            );
            $this->Shell->OptionParser = $this->getMock('ConsoleOptionParser', [], [null, false]);
        }

        /**
         *  tear down method.
         *  
         *  @return void
         */
        public function tearDown()
        {
            parent::tearDown();
            unset($this->Dispatch, $this->Shell);
        }       
   }

4、テスト機能はこのようにすることができます。

 /**
 *  test _F1.
 *  
 *  @return void
 */
public function testF1()
{
    $this->Shell->startup();
    $return = $this->Shell->F1();
    $expectedSellerCount = 14;
    $this->assertSame($expectedSellerCount, $return);
}

そして、http://yourdomain/test.phpで結果を表示できます

于 2017-03-14T07:08:53.080 に答える