3

zf 1.11.11 と phpunit 3.5.15 を使用する複雑なバックエンド アプリケーションがあります。アプリケーションには、いくつかの複雑な通信コンポーネント (soap、rest など) があります。CIS または開発テスト環境では、生産的なサード パーティ バックエンドへの接続または要求を確立できないため、このモデルをモックする必要があります。したがって、ユニットテストレイヤーをモックすると、非常にうまく機能します。完全なカバレッジ - 問題ありません。問題は、コントローラーの統合テスト中にこの手法を使用できないことです。モデルを完全に非表示にする上位層です。したがって、現時点でモックを注入することは不可能だと思います。一方で、これは統合テストの性質であるため、正しくて良いことですが、他方では、コントローラー テストのカバレッジが非常に低くなります。

問題の概要:

  • コンポーネントと通信するテスト サービスを作成できない (高コスト)
  • コントローラーのテスト中にコンポーネントのモックを挿入できません (リクエスト データを設定してディスパッチャーをトリガーするだけです)
  • コントローラーのカバレッジが低すぎる

すべてをプラグインとして実装するソリューションを見てきました。一部の名前空間リダイレクトがモック プラグインを指すことができるようにします。しかし、これが良い解決策だとは思いません。

4

1 に答える 1

0

テスト可能なクラスでの依存性注入の問題を修正するか、次の関数を追加するか、コンストラクターに注入します。

function setDependentProperty(Type $value)
{
    $this->_dependency = $value;
    return $this;
}

function getDependentProperty()
{
    if (!isset($this->_dependency)) {
       $this->_dependency = new DependencyType();
    }
    return $this->_dependency;
}

次に、テストでモックを使用します

function testUseMockedService()
{
    $testedItem = new ObjectToTest();
    $mock = $this->getMock('Service_ToMock',
        array('functionToMock')
    );
    $mock->expects($this->exactly(1))
        ->method('functionToMock')
        ->will($this->returnValue($valueYouWant));

    $testedItem->setDependency($mock);
    $returnValue = $testedItem->doStuff();

    $this->assertEquals($something, $returnValue);
}

ユニットテストは統合テストではなく、非常に分離する必要があることを理解してください

http://www.typemock.com/unit-tests-integration-tests

「適切な」量のカバレッジがないことを理解する

http://www.artima.com/weblogs/viewpost.jsp?thread=204677

于 2012-07-18T18:36:26.610 に答える