8

我目前正在为一个库编写单元测试,在从数据重构业务逻辑之后,我现在对如何测试逻辑有点困惑!

例如,我有一个非常复杂的过程,其中传递了一组数据,我将为此使用数据提供程序,因此我可以确保它适用于各种情况。

对于我将通过数据提供者传递的数据,我是否也应该传递预期的结果?或者这应该在测试中计算。

如前所述,计算的过程是一个相当复杂的过程,并不十分复杂$a + $b

4

2 回答 2

8

为了扩展 Steven 的示例,有时为每个数据集提供一个名称会很有帮助。当其中一个失败时,PHPUnit 将在失败消息中显示其名称而不是“data #0”。

public static function GetRemoteAddressFromWebServerDataProvider()
{
    return array(
        'not forwarded' => array('127.0.0.1',  NULL,           '127.0.0.1'),
        'no remote address' => array('127.0.0.1',  '127.0.0.1',    NULL),
    );
}
于 2012-10-12T19:30:44.293 回答
7

对于数据提供者,我还提供了预期的结果。由于我希望该方法获取输入并返回一个值,因此我不想执行两次计算,因为其中 1 个实现可能有错误。

我不打算使用模拟,因为我实际上是在测试有问题的方法/功能。

如果我们基于 4 个参数进行计算,那么我的数据提供者将传递 5。第一个参数是预期结果,然后是要传递给方法/函数的参数。

由此看来,我的电话非常简单:

public static function GetRemoteAddressFromWebServerDataProvider()
{
    return array(
        array('127.0.0.1',  NULL,           '127.0.0.1'),
        array('127.0.0.1',  '127.0.0.1',    NULL),
        );
}

/**
 * @dataProvider GetRemoteAddressFromWebServerDataProvider
 */
public function testGetRemoteAddressFromWebServer($Result, $HTTPXSetting, $RemoteAddress)
{
    $_SERVER['HTTP_X_FORWARDED_FOR'] = $HTTPXSetting;
    $_SERVER['REMOTE_ADDR']          = $RemoteAddress;
    $this->assertEquals($Result, GetRemoteAddressFromWebServer());
}
于 2012-10-11T15:00:29.140 回答