2016-10-18 4 views
1

私は、仕様をClassAに書き込むためにAAAパターンに従おうとしています。このクラスは、次のようにClassAと相互作用するClassBとの依存関係を持っていますPHPSpecを使用したアレンジ/アクト/アサートパターン

class ClassA 
{ 
    private $objB; 

    public function __construct(ClassB $objB) 
    { 
     $this->objB = $objB; 
    } 

    public function doSomething($arg) 
    { 
     $val1 = $this->objB->someMethod($arg); 

     // do something with variable $val1 

     $this->objB->otherMethodCall(); 
    } 
} 

とその仕様:私は、私はその方法を言ってエラーを得たこの仕様を実行するとClassB::otherMethodCall()ことが期待されていません

class ClassASpec extends ObjectBehavior 
{ 
    function let(ClassB $objB) 
    { 
     $this->beConstructedWith($objB); 
    } 

    function it_should_do_something_cool(ClassB $objB) 
    { 
     // Arrange 
     $objB->someMethod(10)->willReturn(...); 

     // Act 
     $this->doSomething(10); 

     // Assert 
     $objB->otherMethodCall()->shouldHaveBeenCalled(); 
    } 
} 

と呼ばれるだけClassB::someMethod()が期待された。

答えて

1

あなたがこのアサーションを使用する場合は

// Arrange 
$objB->someMethod(10)->willReturn(...); 

あなたダブルモックと、そう、モックとして扱われます(なしshouldHaveBeenだけshouldBe)である

ここ

// Assert 
$objB->otherMethodCall()->shouldHaveBeenCalled(); 

あなたはあなたのオブジェクトをスパイとして扱っていますが、そうではありません。あなたの二重のモックがあるのでモック、スパイとスタブの違いを知るために

// Arrange 
$objB->someMethod(10)->willReturn(...); 

// Assert 
$objB->otherMethodCall()->shouldBeCalled(); 

// Act 
$this->doSomething(10); 

を次のように

は、あなたのコードを変更する必要があり、prophecyphpspecドキュメント

+0

ありがとう@DonCallistoをお読みください。私はあなたが示唆するようにコードを変更します。だから、モックのスパイを使っているときに元の順序でAAAを書くことはできないのですか?私がするべきことは、法の復帰を検証するために、アレンジ、アサート、アクト、アサートを書くことです。 –

+0

@TalesSantos私はその特定の戦略を知らないが、注文が重要であると確信していますか?少なくともphpspecと私が知る限り、ダブルはスパイとモックが同時に(モック)またはメソッドの実行後に(スパイ)チェックされると同時に偽装することができないので、 – DonCallisto

+0

技術的には問題はありませんが、アレンジ、演技、アサートが、仕様を整理した方が良いと思う。とにかく、あなたの答えは、モックとスパイの違いを理解する助けになりました。どうもありがとう。 –

関連する問題