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

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

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

Я только что провел некоторые модульные тесты против приведенных выше примеров, и действительно, они привели к документированному поведению.

Ответ 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);
}