11

JSON形式の本文を含む投稿リクエストを期待するLaravelコントローラーのphpunitテストを作成しようとしています。

コントローラーの簡易バージョン:

class Account_Controller extends Base_Controller
{
    public $restful = true;

    public function post_login()
    {
        $credentials = Input::json();
        return json_encode(array(
            'email' => $credentials->email,
            'session' => 'random_session_key'
        ));
    }
}

現在、データを urlencoded フォーム データとして正しく送信するテスト メソッドがありますが、データを JSON として送信する方法がわかりません。

私のテスト方法 (テストを書くときは github gist hereを使用しました)

class AccountControllerTest extends PHPUnit_Framework_TestCase {
    public function testLogin()
    {
        $post_data = array(
            'email' => 'user@example.com',
            'password' => 'example_password'
        );
        Request::foundation()->server->set('REQUEST_METHOD', 'POST');
        Request::foundation()->request->add($post_data);
        $response = Controller::call('account@login', $post_data);
        //check the $response
    }
}

フロントエンドで angularjs を使用しています。デフォルトでは、サーバーに送信されるリクエストは JSON 形式です。urlencoded フォームを送信するためにこれを変更しないことをお勧めします。

コントローラーに JSON エンコードされた本体を提供するテストメソッドを作成する方法を知っている人はいますか?

4

7 に答える 7

6

これは、Laravel4でこれを行う方法です

// Now Up-vote something with id 53
$this->client->request('POST', '/api/1.0/something/53/rating', array('rating' => 1) );

// I hope we always get a 200 OK
$this->assertTrue($this->client->getResponse()->isOk());

// Get the response and decode it
$jsonResponse = $this->client->getResponse()->getContent();
$responseData = json_decode($jsonResponse);

$responseDatajson 応答に等しい PHP オブジェクトになり、応答をテストすることができます :)

于 2013-07-10T11:13:07.610 に答える
5

これが私のために働いたものです。

$postData = array('foo' => 'bar');
$postRequest = $this->action('POST', 'MyController@myaction', array(), array(), array(), array(), json_encode($postData));
$this->assertTrue($this->client->getResponse()->isOk());

の 7 番目の引数$this->actionは ですcontenthttp://laravel.com/api/source-class-Illuminate.Foundation.Testing.TestCase.html#_actionのドキュメントを参照してください。

于 2014-03-12T16:10:47.153 に答える
2

これを行うには、もっと簡単な方法があります。Input::$json プロパティを post パラメーターとして送信するオブジェクトに設定するだけです。以下のサンプルコードを参照してください

 $data = array(
        'name' => 'sample name',
        'email' => 'abc@yahoo.com',
 );

 Input::$json = (object)$data;

 Request::setMethod('POST');
 $response = Controller::call('client@create');
 $this->assertNotNull($response);
 $this->assertEquals(200, $response->status());

これがあなたのテストケースに役立つことを願っています

更新 : 元の記事はhttp://forums.laravel.io/viewtopic.php?id=2521から入手できます。

于 2013-01-19T01:47:25.940 に答える
1

簡単な解決策は、CURL を使用することです。これにより、サーバーからの「応答」を取得することもできます。

class AccountControllerTest extends PHPUnit_Framework_TestCase
{

 public function testLogin()
 {
    $url = "account/login";

    $post_data = array(
        'email' => 'user@example.com',
        'password' => 'example_password'
    );
    $content = json_encode($post_data);

    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

    $json_response = curl_exec($curl);

    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

    curl_close($curl);

    $response = json_decode($json_response, true);

    // Do some $this->Assert() stuff here on the $status
  }
}

CURL は、JSON を使用して生の HTTP ポストを実際にシミュレートします。つまり、機能を真にテストしていることがわかります。

于 2013-01-05T12:45:44.330 に答える
1

Laravel 5.1 の時点で、PHPunit を介して JSON コントローラーをテストするはるかに簡単な方法があります。データとともに配列を渡すだけで、自動的にエンコードされます。

public function testBasicExample()
{
    $this->post('/user', ['name' => 'Sally'])
         ->seeJson([
            'created' => true,
         ]);
}

ドキュメントから: http://laravel.com/docs/5.1/testing#testing-json-apis

于 2015-06-09T17:49:37.207 に答える