uzullaがブログ

uzullaがブログです。

Slim FrameworkのMock相手にスクレイピングする、PHPUnit向け俺得ライブラリつくったやで

新年明けましておめでとうございます。

はてなブログおみくじ2014

今年の抱負は人に恨まれないようにちゃんと仕事を調整する事です。

新年俺得ライブラリつくった

https://github.com/uzulla/mock_slim_client

Slim FrameworkはMock的な動作ができるのですが、UnitTestでPOSTしたり、帰ってきたHTMLを良い感じにつかう(特にテストとかでスクレイピングする)のが結構不便なのでつくりました。

非常にダーティーな実装ですが、POSTとかできます*1。例は以下。

<?php
class myTest extends \PHPUnit_Framework_TestCase
{
    use \Uzulla\MockSlimClient; // use by trait

    static function registrationRoute($app)
    {
        $app->get('/', function() use ($app){
            //...
        });
        // or \myApp::registrationRoute($app);
    }

    static function createSlim(){
        return new \Slim\Slim([
            'templates.path' => TEMPLATES_DIR_PATH,
            'view' => new \Slim\Views\Twig()
        ]);
    }

    public function testConfirmPost()
    {
        // 生のHTMLをとってくる
        $raw_html = $this->req('/');

        // paquettg/php-html-parserを返す
        $dom = $this->req_dom('/post/form');
        $this->assertTrue(!!$dom->find('input[name=name]'));

        // パラメタ付きPOSTもできます
        $input = http_build_query([
            'nickname'=>'testname'
        ]);
        $dom = $this->req_dom('/post/confirm', 'POST', $input);
        $this->assertEquals($test_name, $dom->find('div.nickname-preview', 0)->text);
    }
}

まあ、これだとどういうことやねんという感じでしょうから、上のGitHubには無駄にサンプルアプリ付きでありますので、適当に動かしていただけます。

Packagistで公開してるので、奇特な方は簡単にご利用いただけます。まだリリース番号振ってませんが、しばらく使ってつかえるなって思ったら振ります。

https://packagist.org/packages/uzulla/mockslimclient

# composer.json
{
    "require": {
        "uzulla/mockslimclient": "dev-master"
    }
}

ということで

今年も宜しくお願い致します。

*1:もっとマシなコードにしたいのだが、どうやるべきか思いつかない。