PHPUnit
laravel5

LaravelのPHPUnitで外部サイトにリクエストを投げる

前に調べた、これや、これのおさらい。ただ、BrowserのテストはDuskで行えるようになってます

結局、普通?の$this->get()は外に出られないのかな???

 Guzzleのインストール

Laravelのディレクトリで、下記を実行。

composer require guzzlehttp/guzzle

実装

とりあえず、test/Feature/ExampleTest.phpを下記のように書き換えます。

test/Unitでもまあ、動きますが。

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use GuzzleHttp\Client; //use

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest1()
    {
        //client
        $client = new Client;

        //request先
        $url = "http://www.bluecode.jp/test/api.php";

        //request
        $res = $client->get($url);

        //jsonからオブジェクトへ
        $obj = json_decode($res->getBody());

        //評価
        $this->assertEquals(200,$res->getStatusCode());
        $this->assertEquals("OK",$obj->status);
        $this->assertRegExp('/^Hello$/',$obj->message);
    }
}

テストの実行

普通にテストを実行します。

vendor/bin/phpunit

Basic認証への対応

テスト環境ではBasic認証がかかってることも多いかと思いますが、その場合は下記のように記述します。

なお、Guzzle5.0以降とそれ以前では書き方が違うようなので注意が必要です。

    public function testBasicTest2()
    {
        //client
        $client = new Client;

        //request先(Basic認証がかかっている想定)
        $url = "http://www.bluecode.jp/test/api.php";

        //request( with basic auth)
        $res = $client->get($url,[
            'auth' => [
                'username',
                'password'
            ]
        ]);

        //評価
        $this->assertEquals(200,$res->getStatusCode());
    }

assertのパターン

過去記事の再記載ですが、とりあえず、

  • ssertEquals($expect,$var) expectとexpectとvarが等しいか?
  • assertRegExp($ptn, $var) 正規表現にマッチするかどうか?
  • assertNull($var)
  • assertTrue($var)
  • assertFalse($var)
  • assertCount($num,$array)
  • assertEmpty($array)

あたりを押さえておけばいいかなと。
その他はphpunit assertでググればいくらでも出てきます。