3

Laravel (Dingo) で API をビルドしましたが、完全に動作します。ただし、API を単体テストするための phpunit の実装に問題があります。

class ProductControllerTest extends TestCase
{
    public function testInsertProductCase()
    {
        $data = array(
            , "description" => "Expensive Pen"
            , "price" => 100
        );

        $server = array();                        
        $this->be($this->apiUser);
        $this->response = $this->call('POST', '/products', [], [], $server, json_encode($data));
        $this->assertTrue($this->response->isOk());
        $this->assertJson($this->response->getContent());
    }

}

その間、私のAPIエンドポイントはこのコントローラー関数を指しています

private function store()
{

    // This always returns null
    $shortInput = Input::only("price");
    $rules = [
            "price" => ["required"]
    ];
    $validator = Validator::make($shortInput, $rules);

    // the code continues
    ...
}

ただし、API がペイロードを認識できないため、常に失敗します。Input::getContent() は JSON を返しますが、Input::only() は空白を返します。これは、要求ペイロードのコンテンツ タイプが JSON の場合にのみ Input::only() が値を返すためです。

では、上記の phpunit コードを content-type application/json を使用するように設定するにはどうすればよいですか? 何か関係があるのではないかと推測しているのですが$server、よくわかりません

編集:実際には、私の最初の考え方には2つの問題があります

  1. Input::getContent() は 6 番目のパラメーターを入力したため機能しますが、Input::only() は 3 番目のパラメーターを入力しなかったため機能しません。@shaddyに感謝
  2. phpunitリクエストヘッダーでコンテンツタイプを設定する方法はまだ答えられていません

ありがとうございます

4

1 に答える 1