我有一个单元测试,用于测试从字符串到整数的变量转换。到目前为止它很好,除了最后一个。
$_GET['name'] = '42000000000000000000000000000000000000';
$text = $input->get( 'name', Convert::T_INTEGER );
$this->assertEquals( 92233720368547755807, $text );
预期是(由测试本身确认),是大值,当使用intval()从字符串转换为整数时会导致溢出,默认为php可以在我的系统上处理的最大整数值。然而,它仍然失败:
Failed asserting that <integer:92233720368547755807> matches expected <double:9.2233720368548E+19>
当我尝试将预期数字强制为整数时:
$this->assertEquals( intval(92233720368547755807), $text );
我明白了:
Failed asserting that <integer:92233720368547755807> matches expected <integer:0>
在测试之前,测试运行的正确性是什么......
相关代码:
public function get( $name, $type = null )
{
$value = $_GET['value'];
if( !is_null( $type ) )
$value = Convert::to( $value, $type );
return $value;
}
和
public static function to( $value, $type )
{
switch( $type )
{
case self::T_INTEGER:
return intval( $value );
default:
return null;
}
}
所以问题是:我如何让这个测试返回正面?
答案 0 :(得分:5)
使用PHP_INT_MAX
常量:
$this->assertEquals( PHP_INT_MAX, $text );
这将解决您的问题,并使您的测试更具便携性(例如,它也适用于32位系统)。
PHP_INT_MAX的值是PHP构建的较大可表示的int
。
答案 1 :(得分:2)
您的号码中还有一个5
。这样:
92233720368547755807
应该是这样的:
9223372036854775807
答案 2 :(得分:-1)
你的问题是,INT_MAX的数字越高,转换为浮动,这会失去精度。如果将它与String进行比较,它总是返回false。
请使用bcmath函数处理如此大的数字。