0

練習用に PHP で単純な RESTful API を作成しています。できるだけテスト可能なコードを書こうとしています。多くのチュートリアルを読み、いくつかのビデオを見た後でも、これをどのように設計するかについてまだ途方に暮れています.

基本的に、Router クラスをセットアップしました。これは、URL パスをコントローラー メソッドにマッピングする役割を果たします。

ルートを追加した後、ルーターの状態を簡単にテストできます。

しかし、respond() で適切な class->function(params) が呼び出されているかどうかをテストするにはどうすればよいですか?

私はPHPUnitを使用しており、モックについて読んでいます。このコンテキストでそれらを使用する方法がわかりません。

現在、respond() は指定されたパスとリクエスト メソッドを解析し、マップされたメソッドを呼び出します。

これが私の現在のデザインです:

private $routes;

public function __construct() {
    $routes = array();
}

/**
 * Gets all current routes
 */
public function getRoutes();

/**
 * Sets all routes
 */
public function setRoutes($routes);

/**
 * Routes GET request
 */
public function get();

/**
 * Routes POST request
 */
public function post();

/**
 * Routes PUT request
 */
public function put();

/**
 * Routes DELETE request
 */
public function delete();

/**
 * Sets up default paths for a given resource
 */
public function resource();



/**
 * Respond to request
 * @return mixed          JSON of resource data
 */
public function respond($req_method, $request);

/**
 * Returns mapped call info from request method and path
 * @return mixed         An array of the call and params
 */
private function parse($req_method, $request);
4

1 に答える 1

0

コメントが示しているように、これはスパイまたはモッキング システムの適切な使用方法です。PHPunit には、モックを作成してテストする機能がありますが、別のライブラリである Mockery を使用することを好みます

このコードは、クラスを作成し、 を呼び出すaverage()と 3 回呼び出され、指定された値が返されることをテストします。

shouldReceive('get')->once()(たとえば)モックを設定した後、コードは Respond() を呼び出します。ティアダウンの m::close は、get() が 1 回だけ呼び出されたことを確認し、そうでない場合はテストに失敗します。

<?php
use \Mockery as m;
class TemperatureTest extends PHPUnit_Framework_TestCase
{
    public function tearDown()
    {
        m::close();
    }
    public function testGetsAverageTemperatureFromThreeServiceReadings()
    {
        $service = m::mock('service');
        $service->shouldReceive('readTemp')->times(3)->andReturn(10, 12, 14);
        $temperature = new Temperature($service);
        $this->assertEquals(12, $temperature->average());
    }
}

Respond() で作業を行うために実際のクラスを呼び出すことになるため、「部分的なモック」が必要になります。

$restful= m::mock('RestfulController[get]');
$restful->shouldReceive('get')->once();
于 2013-05-25T00:07:09.067 に答える