0

我正在 PHP 中创建一个简单的 RESTful API 以供练习。我正在尝试编写尽可能可测试的代码。看了很多教程,看了一些视频,我仍然对如何设计这个感到茫然。

基本上,我已经建立了一个路由器类。它负责将 url 路径映射到控制器方法。

添加路由后很容易测试路由器的状态。

但是,我如何测试是否在 response() 中调用了正确的 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()(例如),您的代码将调用响应()。拆解中的 m::close 将验证 get() 是否被调用了一次,如果没有调用,则测试失败。

<?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());
    }
}

由于您将调用一个真正的类来在 response() 中工作,因此您将需要一个“部分模拟

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