PHPUnit contiene un assertEquals método: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals

También tiene un assertSame método: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame

A primera vista parece que hacer la misma cosa. ¿Cuál es la diferencia entre los dos? ¿Por qué son ambos especificado?

InformationsquelleAutor Kevin Burke | 2012-04-20

7 Comentarios

  1. 183

    Yo uso tanto de forma esporádica, pero de acuerdo a la documentación:

    assertSame

    Informa de un error detectado por $message si las dos variables $expected y $actual no tienen el mismo tipo y valor

    Y como se puede ver en el ejemplo siguiente, el anterior extracto, están pasando '2204' y 2204, que se producirá mediante assertSame porque uno es un string y uno es un int, básicamente:

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

    assertEquals

    «Informa de un error detectado por $mensaje si las dos variables $esperaba y $reales no son iguales.»

    assertEquals no parece tomar el tipo de datos en consideración, de manera utilizando el ejemplo anterior de 2204:

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

    Acabo de correr algunas pruebas de unidad en contra de los ejemplos anteriores, y de hecho se tradujo en el comportamiento documentado.

    • assertEquals incluso se piensa que '0012' == '12'. Incluso si ambos valores son cadenas, que se convierten en enteros para la comparación! Realmente debería usar assertSame siempre que puede.
    • Por desgracia, incluso assertEquals parece ser exigente por ejemplo, cuando se comparan las propiedades de matriz y se queja de la cadena vs int a continuación.
    • Siguiente marco-fiset comentario, nota este comportamiento ya no es el caso ya que PHPUnit 4.0, consulte el notas de la actualización.
    • La referencia es genial, pero la URL es incorrecta (porque de corchete de cierre)… por favor, puedes arreglarlo? Thx!
    • Nota importante en la comparación de objetos con assertSame(). Informa de un error detectado por $mensaje si las dos variables $esperaba y $reales no hacen referencia al mismo objeto. phpunit.de/manual/current/en/…
    • Sólo quiero señalar algo extraño. Cuando hago assertEquals(['test'], 'test), me sale un mensaje de error diciendo 'test' does not match expected type "array". Así que parece que assertEquals toma de tipo de datos en la consideración de algunos casos?
    • Creo que es la intención de afirmar que $actual == $expected y el resultado corresponde a la comparación usando la igualdad (doble es igual a) el operador con el estándar de PHP tipo de malabares – que no convertir cadenas a las matrices o viceversa ('test' !== ['test'] pero también 'test' != ['test']).
    • assertSame también comprueba si los dos objetos se refiere al mismo objeto, si se pasa de dos variables.

  2. 19

    Cuando se trata de objetos de comparación:

    assertSame: sólo se puede afirmar si 2 objetos se hace referencia a la misma instancia del objeto. Así que incluso si 2 separar los objetos tienen para todos sus atributos exactamente los mismos valores, assertSame va a fallar, si ellos no hacen referencia a la misma instancia.

        $expected = new \stdClass();
        $expected->foo = 'foo';
        $expected->bar = 'bar';
    
        $actual = new \stdClass();
        $actual->foo = 'foo';
        $actual->bar = 'bar';
    
        $this->assertSame($expected, $actual); FAILS

    assertEquals: puede afirmar si 2 objetos independientes coinciden con sus valores de atributo en cualquier caso. Así que es el método adecuado para hacer valer objeto de partido.

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

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

    • Mientras que esta respuesta no es completa (sólo cubre objetos), es exactamente lo que yo necesitaba saber. Gracias! 🙂
  3. 18
    $this->assertEquals(3, true);
    $this->assertSame(3, true);

    El primero va a pasar!

    El segundo fallará.

    Esa es la diferencia.

    Creo que siempre se debe utilizar la assertSame.

    • Yo tuve un problema durante el desarrollo dirigido por pruebas. prueba de pasado, asumió el valor 3 se va a devolver, pero la verdad fue devuelto. curiosamente $this->assertEquals(‘3’, true); falla.
  4. 3

    Como se ha dicho antes,AssertSame informa de un error si los dos elementos no comparten tipo y valor pero también es importante tener en cuenta esto desde el docummentation:

    Informa de un error detectado por $mensaje si las dos variables $espera
    y $reales no hacen referencia al mismo objeto.

    Por lo que esta prueba podría fallar demasiado, incluso a pesar de que comparten el tipo y valor:

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

    Por otra parte,

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

    assertSame() == Pruebas de que si la salida real y la esperada del parámetro son los mismos.

    que es :

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

    o

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

    assertEquals == Si vemos que con respecto a una página del sitio web, tengo una página que tiene 2 ‘tabla’ así que cuando me encuentro assertEquals voy a comprobar su recuento de que la ‘tabla’ son 2 mediante el uso de una función count.
    Por ejemplo:

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

    Aquí podemos ver que assertEquals comprueba que hay 2 tablas en la página web. también podemos utilizar las divisiones se encuentran en la página usando ‘#nombre de división’ dentro del soporte.

    Por ejemplo, 2:

    public function testAdd()
    {
        $calc = new Calculator();
    
        $result = $calc->add(30, 12);
    
        //assert that our calculator added the numbers correctly!
        $this->assertEquals(42, $result);
    }
    • Por favor, utilice el código de formato para hacer el código más legible, y evitar el uso de # marcado a menos que quieras hacer una partida.
  7. 0

    Como se ha mencionado anteriormente, assertEquals() es principalmente acerca de la interpretación del valor, sea por el tipo de malabares o de un objeto con un __presentación de magia método (__toString() por ejemplo).

    Un buen caso de uso para assertSame() es la prueba de un singleton de fábrica.

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

Dejar respuesta

Please enter your comment!
Please enter your name here