Unit testing 如果函数已被调用,如何进行单元测试?依赖注入?
我正在用PHP创建一个简单的RESTful API以供练习。我正在努力编写尽可能可测试的代码。在阅读了许多教程和观看了一些视频之后,我仍然对如何设计这个感到困惑 基本上,我已经建立了一个路由器类。它负责将url路径映射到控制器方法 添加路由后,很容易测试路由器的状态 但是,如何测试respond()中是否调用了正确的类->函数(params)? 我正在使用PHPUnit,我一直在阅读有关mock的文章。我不知道在这种情况下如何使用它们 当前,respond()解析给定的路径和请求方法,并调用映射的方法 以下是我目前的设计:Unit testing 如果函数已被调用,如何进行单元测试?依赖注入?,unit-testing,testing,tdd,phpunit,Unit Testing,Testing,Tdd,Phpunit,我正在用PHP创建一个简单的RESTful API以供练习。我正在努力编写尽可能可测试的代码。在阅读了许多教程和观看了一些视频之后,我仍然对如何设计这个感到困惑 基本上,我已经建立了一个路由器类。它负责将url路径映射到控制器方法 添加路由后,很容易测试路由器的状态 但是,如何测试respond()中是否调用了正确的类->函数(params)? 我正在使用PHPUnit,我一直在阅读有关mock的文章。我不知道在这种情况下如何使用它们 当前,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);
正如评论所指出的,这将是一个间谍或模拟系统的良好使用。PHPunit有一些创建和测试mock的能力,但我更喜欢使用另一个库- 这段代码将创建一个类,并测试当您调用
average()
时,它会被调用三次,然后还会返回一个给定的值
您的代码将在设置一个模拟后调用respond(),该模拟将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());
}
}
您不能创建一个实例并将其连接到调用TestSpy控制器方法(一个记录是否被调用的方法)吗?在您的测试中,您可以发送一个请求URL,然后检查TestSpy控制器是否调用了正确的方法。能否显示要测试的方法代码?回答你的问题会更简单:)干杯!通常情况下,一个人在完成测试之前不会编写代码。我在问一个设计问题。谢谢,阿利斯特。我对嘲弄和嘲弄都很熟悉。不过,在某种程度上,我觉得我可能对该方法的实现进行了“太深”的测试。当我想测试控制器是否与模型交互时,我遇到了同样的问题。
$restful= m::mock('RestfulController[get]');
$restful->shouldReceive('get')->once();