Разница между assertEquals и assertSame в phpunit?
PHPUnit содержит метод assertEquals: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals
Он также имеет метод assertSame: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame
На первый взгляд похоже, что они делают то же самое. Какая разница между двумя? Почему они оба указаны?
Ответы
Ответ 1
Я использую оба спорадически, но в соответствии с документами:
Сообщает об ошибке, идентифицированной $message
, если две переменные $expected
и $actual
не имеют того же типа и .
И как вы можете видеть в приведенном ниже примере вышеприведенного отрывка, они передают '2204'
и 2204
, которые не сработают с помощью assertSame
, потому что один из них является string
, а один - int,
в основном:
'2204' !== 2204
assertSame('2204', 2204) // this test fails
"Сообщает об ошибке, идентифицированной $message, если две переменные $expected и $actual не равны."
assertEquals
, как представляется, не учитывает тип данных, поэтому, используя приведенный выше пример 2204
:
'2204' == 2204
assertEquals('2204', 2204) // this test passes
Я только что провел некоторые модульные тесты против приведенных выше примеров, и действительно, они привели к документированному поведению.
Ответ 2
$this->assertEquals(3, true);
$this->assertSame(3, true);
Первый пройдет!
Второй не будет выполнен.
В этом разница.
Я думаю, вы всегда должны использовать assertSame.
Ответ 3
Когда дело доходит до сравнения объектов:
assertSame: может утверждать только, если 2 объекта ссылаются на один и тот же экземпляр объекта. Поэтому, даже если 2 отдельных объекта имеют для всех своих атрибутов точно одинаковые значения, assertSame завершится с ошибкой, если они не ссылаются на один и тот же экземпляр.
$expected = new \stdClass();
$expected->foo = 'foo';
$expected->bar = 'bar';
$actual = new \stdClass();
$actual->foo = 'foo';
$actual->bar = 'bar';
$this->assertSame($expected, $actual); FAILS
assertEquals: может утверждать, что в любом случае 2 отдельных объекта соответствуют их значениям атрибутов. Таким образом, это метод, подходящий для утверждения соответствия объекта.
$this->assertEquals($expected, $actual); PASSES
https://phpunit.de/manual/current/en/appendixes.assertions.html
Ответ 4
Кроме того,
// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");
Ответ 5
Как уже говорилось, AssertSame
сообщает об ошибке, если два элемента не разделяют тип и значение, но также важно отметить это из docummentation:
Сообщает об ошибке, идентифицированной $message, если две переменные $ожидаются и $actual не ссылаются на один и тот же объект.
Таким образом, этот тест завершится неудачно, даже если они разделяют тип и значение:
class SameTest extends TestCase
{
public function testFailure()
{
$this->assertSame(new stdClass, new stdClass);
}
}
Ответ 6
assertSame() == Проверяет, что если фактический вывод и ожидаемый параметр одинаковы.
то есть:
$this->assertSame('$expected','$expected');
или
$this->assertSame('100','100');
assertEquals == Если мы увидим по отношению к странице веб-сайта, у меня есть страница с 2 "таблицами", поэтому, когда я запускаю assertEquals, я проверю ее количество, что "таблица" равна 2, используя функцию count.
Например:
$this->assertEquals(2, $var->filter('table')->count());
Здесь мы видим, что assertEquals проверяет наличие на веб-странице двух таблиц. мы также можем использовать разбиения, найденные на странице, используя "имя раздела" внутри скобки.
Например, 2:
public function testAdd()
{
$calc = new Calculator();
$result = $calc->add(30, 12);
// assert that our calculator added the numbers correctly!
$this->assertEquals(42, $result);
}