我正在为一个库编写单元测试,在从数据重构业务逻辑之后,我现在对如何测试逻辑感到困惑!
例如,我有一个非常复杂的过程,其中传递了一组数据,我将使用数据提供程序,因此我可以确保它适用于各种情况。
对于我将通过数据提供者传递的数据,我是否也应该通过预期的结果?或者应该在测试中计算出来。
如上所述,计算过程是一个非常复杂的过程,而不是$a + $b
。
答案 0 :(得分: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),
);
}
答案 1 :(得分:7)
对于数据提供者,我也提供了预期的结果。由于我希望该方法获取输入并返回一个值,我不想实现两次计算,因为其中一个实现可能有错误。
我不想使用模拟,因为我实际上正在测试有问题的方法/函数。
如果我们基于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());
}