Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如果函数已被调用,如何进行单元测试?依赖注入?_Unit Testing_Testing_Tdd_Phpunit - Fatal编程技术网

Unit testing 如果函数已被调用,如何进行单元测试?依赖注入?

Unit testing 如果函数已被调用,如何进行单元测试?依赖注入?,unit-testing,testing,tdd,phpunit,Unit Testing,Testing,Tdd,Phpunit,我正在用PHP创建一个简单的RESTful API以供练习。我正在努力编写尽可能可测试的代码。在阅读了许多教程和观看了一些视频之后,我仍然对如何设计这个感到困惑 基本上,我已经建立了一个路由器类。它负责将url路径映射到控制器方法 添加路由后,很容易测试路由器的状态 但是,如何测试respond()中是否调用了正确的类->函数(params)? 我正在使用PHPUnit,我一直在阅读有关mock的文章。我不知道在这种情况下如何使用它们 当前,respond()解析给定的路径和请求方法,并调用映射

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