我正在用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);
答案 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();