web-dev-qa-db-fra.com

Différence entre assertEquals et assertSame dans phpunit?

PHPUnit contient une méthode assertEquals: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals

Il a également une méthode assertSame: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame

À première vue, on dirait qu'ils font la même chose. Quelle est la différence entre les deux? Pourquoi sont-ils spécifiés tous les deux?

94
Kevin Burke

J'utilise les deux sporadiquement, mais selon la documentation:

assertSame

Rapporte une erreur identifiée par $message si les deux variables $expected et $actual n'ont pas le même type et valeur. "

Et comme vous pouvez le voir dans l'exemple ci-dessous, ils passent '2204' et 2204, ce qui échouera avec assertSame car l'un est un string et l'autre un int,, en gros:

'2204' !== 2204
assertSame('2204', 2204) // this test fails

assertEquals

"Rapporte une erreur identifiée par $ message si les deux variables $ attendues et $ réelles ne sont pas égales."

assertEquals ne semble pas prendre en compte le type de données; utilisez donc l'exemple ci-dessus de 2204:

'2204' == 2204
assertEquals('2204', 2204) // this test passes

Je viens de lancer quelques tests unitaires par rapport aux exemples ci-dessus et ils ont effectivement entraîné un comportement documenté.

158
Mike Purcell
$this->assertEquals(3, true);
$this->assertSame(3, true);

Le premier passera!

Le second va échouer.

C'est la différence.

Je pense que vous devriez toujours utiliser assertSame.

16
bronze man

En ce qui concerne la comparaison d'objets:

assertSame: ne peut affirmer que si 2 objets référencent la même instance d'objet. Ainsi, même si deux objets distincts ont exactement la même valeur pour tous leurs attributs, assertSame échouera s'ils ne font pas référence à la même instance.

    $expected = new \stdClass();
    $expected->foo = 'foo';
    $expected->bar = 'bar';

    $actual = new \stdClass();
    $actual->foo = 'foo';
    $actual->bar = 'bar';

    $this->assertSame($expected, $actual); FAILS

assertEquals: peut affirmer si 2 objets distincts correspondent à leurs valeurs d'attribut dans tous les cas. C'est donc la méthode appropriée pour affirmer la correspondance d'objet.

    $this->assertEquals($expected, $actual); PASSES

https://phpunit.de/manual/current/en/appendixes.assertions.html

15
Grigoreas P.

Comme il a été dit précédemment, AssertSame rapporte une erreur si les deux éléments ne partagent pas type et value, mais il est également important de noter cela à partir de documentation :

Rapporte une erreur identifiée par $ message si les deux variables $ attendues et $ actual ne font pas référence au même objet.

Donc, ce test échouerait aussi, même s'ils partagent le type et la valeur:

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}

En outre,

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");
1
GogromaT

Comme mentionné précédemment, assertEquals() concerne principalement une valeur interprétée, que ce soit par type de jonglerie ou un objet avec une méthode de présentation __magic (par exemple, __toString().

Un bon cas d'utilisation de assertSame() teste une fabrique de singleton.

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
0
Richard A Quadling

assertSame () == Vérifie que si la sortie réelle et le paramètre attendu sont identiques. 

c'est : 

$this->assertSame('$expected','$expected');

ou 

$this->assertSame('100','100');

assertEquals == Si nous voyons en ce qui concerne une page de site Web, j'ai une page qui a 2 'table' donc quand je lance assertEquals je vérifierai son compte que les 'table' sont 2 en utilisant une fonction de comptage . Par exemple : 

$this->assertEquals(2, $var->filter('table')->count()); 

Nous pouvons voir ici que assertEquals vérifie la présence de deux tables sur la page Web. nous pouvons également utiliser les divisions trouvées sur la page en utilisant '#division name' à l'intérieur du crochet.

Exemple 2: 

public function testAdd()
{
    $calc = new Calculator();

    $result = $calc->add(30, 12);

    // assert that our calculator added the numbers correctly!
    $this->assertEquals(42, $result);
}
0
Arpan Buch