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?
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é.
$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.
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
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");
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());
}
}
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);
}