Разница между 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 90

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());
    }
}