如何断言结果是PHPUnit中的整数?

时间:2014-02-09 02:12:43

标签: php unit-testing phpunit

我希望能够测试结果是一个整数(1,2,3 ...),其中函数可以返回任何数字,例如:

$new_id = generate_id();

我原以为它会像:

$this->assertInstanceOf('int', $new_id);

但是我收到了这个错误:

PHPUnit_Framework_Assert :: assertInstanceOf()的参数#1必须是类或接口名称

6 个答案:

答案 0 :(得分:112)

$this->assertInternalType("int", $id);

修改:从PHPUnit 8开始,答案是:

$this->assertIsInt($id);

答案 1 :(得分:28)

我更喜欢使用官方的PHPUnit类常量。

PHPUnit v5.2

use PHPUnit_Framework_Constraint_IsType as PHPUnit_IsType;

// ...

$this->assertInternalType(PHPUnit_IsType::TYPE_INT, $new_id);

或者在撰写本文时最新的v7.0

use PHPUnit\Framework\Constraint\IsType;

// ...

$this->assertInternalType(IsType::TYPE_INT, $new_id);

答案 2 :(得分:16)

下面给出了后人的原始答案,但强烈建议您按照其他答案的建议使用assertInternalType()


原始答案:

只需将assertTrue与is_int()一起使用。

$this->assertTrue(is_int($new_id));

答案 3 :(得分:5)

我认为最好使用这种结构:

$this->assertThat($new_id, $this->logicalAnd(
    $this->isType('int'), 
    $this->greaterThan(0)
));

因为它不仅会检查$ new_id变量的类型,还会检查此变量是否大于0(假设id不能为负或零),这样更严格和安全。

答案 4 :(得分:2)

从PHPUnit 8开始,不建议使用其他方法,assertInternalType()现在将引发此错误并失败:

  

assertInternalType()已弃用,并将在PHPUnit 9中删除。重构测试以使用assertIsArray(),assertIsBool(),assertIsFloat(),assertIsInt(),assertIsNumeric(),assertIsObject(),assertIsResource(),assertIsString (),assertIsScalar(),assertIsCallable()或assertIsIterable()代替。

现在建议为此目的使用assertIsNumeric()assertIsInt()

答案 5 :(得分:0)

这个答案是给那些想知道如何确保结果是整数还是整数字符串的人们提供的。 (该问题出现在一些评论中):

$this->assertEquals( 1 , preg_match( '/^[0-9]+$/', $new_id ),
    $new_id . ' is not a set of digits' );

在这里,我们确保preg_match返回一个“ 1”,其中preg_match正在测试所有字符串字符都是数字。