Разница между 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
на первый взгляд кажется, что они делают то же самое. В чем разница между ними? Почему они оба указаны?
7 ответов:
я использую оба спорадически, но в соответствии с документами:
assertSame
сообщает об ошибке, выявленных
$message
Если две переменные$expected
и$actual
нет же тип и стоимостью."и как вы можете видеть в примере выше отрывке, они передают
'2204'
и2204
, который не будет использоватьassertSame
за одинstring
и одинint,
по сути:'2204' !== 2204 assertSame('2204', 2204) // this test fails
assertEquals
" сообщает об ошибке, идентифицированной $ message, если две переменные $expected и $actual не равны."
assertEquals
не кажется, чтобы принять тип данных во внимание так, используя приведенный выше пример2204
:'2204' == 2204 assertEquals('2204', 2204) // this test passes
я только что провел несколько модульных тестов против приведенных выше примеров, и действительно они привели к документированному поведению.
$this->assertEquals(3, true); $this->assertSame(3, true);
первый пройдет!
второй не получится.
вот в чем разница.
Я думаю, что вы всегда должны использовать assertSame.
когда дело доходит до сравнения объектов:
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
Как уже было сказано ранее,
AssertSame
сообщение об ошибке, если два элемента не разделяю тип и стоимостью но также важно отметить это из docummentation:сообщает об ошибке, идентифицированной $ message, если две переменные $ожидаются и $actual не ссылаются на один и тот же объект.
таким образом, этот тест тоже потерпит неудачу, хотя они разделяют тип и значение:
class SameTest extends TestCase { public function testFailure() { $this->assertSame(new stdClass, new stdClass); } }
кроме того,
// Passes $this->assertSame("123.", "123."); $this->assertEquals("123.", "123"); // Fails $this->assertSame("123.", "123");
assertSame () = = проверяет, совпадают ли фактические выходные данные и ожидаемый параметр.
что есть :
$this->assertSame('$expected','$expected');
или
$this->assertSame('100','100');
assertEquals == если мы видим в отношении страницы веб-сайта, у меня есть страница, которая имеет 2 "таблицы", поэтому, когда я запускаю assertEquals, я проверю ее количество, что "таблица" - это 2 с помощью функции count. Например:
$this->assertEquals(2, $var->filter('table')->count());
здесь мы видим, что assertEquals проверяет, что есть 2 таблицы на веб-странице. мы также можем использовать подразделения, найденные на странице, используя "#division name " внутри скобки.
Пример 2:
public function testAdd() { $calc = new Calculator(); $result = $calc->add(30, 12); // assert that our calculator added the numbers correctly! $this->assertEquals(42, $result); }
Как упоминалось ранее,
assertEquals()
в первую очередь о интерпретируемом значении, будь то жонглирование типом или объект с __magic presentation method (__toString()
например).в
assertSame()
тестирует синглтон фабрики.class CacheFactoryTest extends TestCase { public function testThatCacheFactoryReturnsSingletons() { $this->assertSame(CacheFactory::create(), CacheFactory::create()); } }