Подтвердить что ты не робот

Как утверждать, что результат является целым числом в PHPUnit?

Я хотел бы иметь возможность проверить, что результатом является целое число (1,2,3...), где функция может возвращать любое число, например:

$new_id = generate_id();

Я подумал, что это будет что-то вроде:

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

Но я получаю эту ошибку:

Аргумент # 1 PHPUnit_Framework_Assert:: assertInstanceOf() должен быть именем класса или интерфейса

4b9b3361

Ответ 1

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

Изменить: Начиная с PHPUnit 8 ответ:

$this->assertIsInt($id);

Ответ 2

Я предпочитаю использовать официальные константы класса 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);

Ответ 3

Оригинальный ответ приведен ниже для потомков, но я настоятельно рекомендую использовать assertInternalType(), как это предлагается в других ответах.


Оригинальный ответ:

Просто используйте assertTrue с is_int().

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

Ответ 4

Я думаю, лучше использовать эту конструкцию:

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

потому что он проверит не только тип переменной $ new_id, но и проверит, больше ли эта переменная, чем 0 (предположим, id не может быть отрицательным или нулевым), и это более строго и безопасно.

Ответ 5

Начиная с PHPUnit 8, другие подходы устарели, assertInternalType() теперь выдаст эту ошибку и завершится ошибкой:

assertInternalType() устарела и будет удалена в PHPUnit 9. Рефакторинг вашего теста для использования assertIsArray(), assertIsBool(), assertIsFloat(), assertIsInt(), assertIsNumeric(), assertIsObject(), assertIsRisString() Вместо этого assertIsScalar(), assertIsCallable() или assertIsIterable().

Теперь для этой цели рекомендуется использовать assertIsNumeric() или assertIsInt().

Ответ 6

Этот ответ для людей, задающихся вопросом, как удостовериться, что результатом является ЛИБО целое число или строка целых чисел. (Проблема появляется в некоторых комментариях):

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

Здесь мы удостоверимся, что preg_match возвращает '1', где preg_match проверяет, что все строковые символы являются цифрами.