如果调用函数如何进行单元测试?依赖注入?

时间:2013-05-22 20:29:05

标签: unit-testing testing tdd phpunit

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

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

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

但是,我如何测试是否在response()中调用了正确的class->函数(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);

1 个答案:

答案 0 :(得分:0)

正如评论所指出的,这可以很好地利用间谍或嘲弄系统。 PHPunit有一些创建和测试模拟的能力,但我更喜欢使用不同的库 - Mockery

此代码将创建一个类,并测试当您调用average()时,它被调用三次,然后还返回给定值。

在设置shouldReceive('get')->once()(例如)的模拟后,您的代码将调用respond()。拆解中的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());
    }
}

由于你要召集一个真正的班级来做响应(),你需要一个'partial mock'

$restful= m::mock('RestfulController[get]');
$restful->shouldReceive('get')->once();