2

これは create function の単体テストです:

  public function testCreate() {
    $this->routeMatch->setMatchedRouteName('restful');
    $this->request->setMethod('POST')
                  ->setContent('name=A');

    $result = $this->controller->dispatch($this->request);
    $response  = $this->controller->getResponse();

    $this->assertEquals(403, $response->getStatusCode());
    $this->assertArrayHasKey('id', $result);
  }

そして、これは私の機能です:

public function create($data) {
    if (empty($data)) {
      $this->response->setStatusCode(400);
      return;
    }

    for ($i = 0; $i < count(self::$ideas); $i++) {
      if (self::$ideas[$i]['name'] == $data['name']) {
        $this->response->setStatusCode(404);
        return;
      }
    }

    //@todo: secure the API
    self::$index++;
    $tmpArray = array('id'=>self::$index, 'name'=>$data['name']);
    $this->response->setStatusCode(403);
  }

しかし、 $data は常に空白のようです。ユニットテストを書く部分で間違っていますか?curl POST を で使用しようとすると-d、 $data は、投稿したものとして値を持ちますcurl。私はここで何が間違っているのですか?

読んでくれてありがとう、そしてあなたの答えを楽しみにしています:)

答え

私は成功した単体テストを思いついたhttp://pastebin.com/fwFe0Mi3

詳細については、このモジュールを使用して安静なコントローラーを実装します

4

1 に答える 1

3

\Zend\Mvc\Controller\AbstractRestfulController メソッドの processPostData を見ると、コントローラの create メソッドに、リクエスト オブジェクトからの post パラメータの配列が与えられていることがわかります。

\Zend\Http\Request を見ると、$postParams プロパティは setPost メソッドによって設定されています。

インスタンス化 (__contruct メソッド) で \Zend\Http\Request (上記) を拡張する子クラス \Zend\Http\PhpEnvironment\Request (何かを要求するときに ZF2 によって使用される) は、setPost メソッド (上記) を呼び出して $ _POST 配列。

これは、最終的に ZF2 がリクエスト本文を解析するのではなく、コントローラーの create メソッドに $_POST コンテンツを内部的にフィードすることを意味します。

今あなたのコードに。

最初にイベント フレームワークをセットアップしなければ、dispatch は何もしないと思います。代わりに、MvcEvent を提供するコントローラーの execute メソッドを呼び出すことができます。MvcEvent には、インスタンス化したリクエストを設定する必要があります。次に、上記のように、リクエストの setPost を呼び出して、create メソッドが正しく機能するように配列を渡す必要があります。(一方、PUT はリクエストボディからデータを読み取ります)

試してみてください。それでも問題が解決しない場合は、すぐに例を示します。

于 2013-01-08T08:18:18.993 に答える