phpユニットテストステップ(13)-コアテクノロジー-mockオブジェクト-mockとstubを同時に使用

4962 ワード

phpユニットテストステップ(13)-コアテクノロジー-mockオブジェクト-mockとstubを同時に使用
このシリーズの文章の主なコードと文字は「ユニットテストの芸術」に由来し、原作者:Roy Osherove.金迎.
このシリーズの文章はphpの文法と使用習慣に基づいて改編された.すべてのコードは本機でテストに合格した.転載する場合は出典を明記してください.需要変更を仮定すると、より複雑になります.ファイル名が短すぎると、ウェブサービスはログを記録しますが、万が一記録中に異常が発生した場合は、メールを送信する必要があります.テストを要求してメールを送信するのは成功した.
ソースコードには2つのインタフェースがあり,1つの被測定クラスがある.テストコードには2つの擬似オブジェクトクラス、1つのテストクラスがあります.
ソースコード
(1)t 2アプリケーションindexcontrollerで、エラーログインタフェースIWebServices.php

(2)t 2アプリケーションindexcontrollerで、メールインタフェースIEmailServices.php

(3)被測定類は,万一異常を投げたらメールを送るという機能を実現する.t 2アプリケーションindexcontrollerでLogAnalyzer.php
service = $service;
        $this->email = $email;
    }
    
    /**
     *     ,      ,       ,      ,      。
     * @param string $filename
     */
    public function analyze($filename)
    {
        if (strlen($filename) < 8 ) {
            try {
                $this->service->logError("Filename too short:{$filename}");
            } catch ( \Exception $e ) {
                $this->email->sendEMail("[email protected]", "can not log", $e->getMessage());
            }
        }
        //         。
        // ... ...
    }
}

テストコード
(4)t 2testsindexcontrollerで、エラーログインタフェースの杭類FakeWebServicesを実現する.php
toThrow) {
            throw $this->toThrow;
        }
    }
}

(5)t 2testsindexcontrollerの下で、メールインタフェースのmockクラスを実現し、断言するFakeEmailServices.php
to = $to;
        $this->subject = $subject;
        $this->body = $body;
    }
}

(6)テストクラスは,主に投げ異常を断言した場合,メール送信に成功した.t 2testsindexcontroller下、LogAnalyzerTest.php
toThrow = new \Exception("fake exception");
        
        //  mock  ,   
        $mockEmail = new FakeEmailService();
        
        //         ,  mock     
        $analyzer = new \app\index\controller\LogAnalyzer($stubService, $mockEmail);
        $tooShortFileName= 'abc.ext';
        
        //      
        $analyzer->analyze($tooShortFileName);
        
        //     mock    !!
        $this->assertEquals($mockEmail->to, "[email protected]");
        $this->assertEquals($mockEmail->subject, "can not log");
        $this->assertEquals($mockEmail->body, "fake exception");
    }
}

cmdでテストに合格した.
まとめ
原作者は次のように考えている.
  • の1つのテストでは、最大1つのmockオブジェクトしかないはずです.他のすべての偽オブジェクトは杭であるべきです.複数のmockオブジェクトがある場合は、複数のテストに分けて、各テストに1つのmockオブジェクトしかないことを確認します.
  • 1のテストでは、作業ユニットの3つの最終結果のうちの1つしか断言できません.3つの結果は,断言戻り値,断言オブジェクトまたはシステム状態,断言オブジェクトインタラクションである.目的は明確にしなければならない.複数の異なるテスト意図がある場合は、複数のテストに分ける必要があります.