Phpunit'te assertEquals ve assertSame arasındaki fark nedir?


Yanıtlar:


198

İkisini de ara sıra kullanıyorum, ancak belgelere göre:

assertSame

Tarafından tespit bir hata Raporları $messageeğer iki değişken $expectedve $actualaynı yok tipini ve değerini ".

Ve yukarıdaki alıntıdaki örnekte görebileceğiniz gibi, geçerler '2204've 2204kullanmada başarısız olurlar, assertSameçünkü biri a stringve biri int,temelde birdir :

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

assertEquals

"$ Beklenen ve $ gerçek değişkenleri eşit değilse, $ message tarafından tanımlanan bir hatayı bildirir."

assertEqualsveri türünü dikkate almıyor gibi görünüyor, bu nedenle yukarıdaki örneği kullanarak 2204:

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

Yukarıdaki örneklere karşı bazı birim testleri yaptım ve aslında belgelenmiş davranışlarla sonuçlandılar.


17
hatta assertEquals bunu düşünüyor '0012' == '12'. Her iki değer de dize olsa bile, karşılaştırma için tamsayılara dönüştürülürler! Gerçekten yapabildiğiniz her zaman assertSame kullanmalısınız.
marco-fiset

2
Maalesef, assertEquals bile seçici görünüyor, örneğin dizi özelliklerini karşılaştırırken ve o zaman dizge ile int hakkında şikayet ederken.
andig

1
Marco-fiset'in yorumunu takiben, bu davranışın PHPUnit 4.0'dan beri geçerli olmadığını unutmayın, yükseltme notlarına bakın .
Gras Double

@coviex Referans güzel, ancak URL yanlış (köşeli parantezin kapatılması nedeniyle) ... lütfen düzeltebilir misiniz? Teşekkürler!
Hıristiyan

3
Önemli not nesneleri karşılaştırarak ile assertSame(). $ Beklenen ve $ gerçek değişkenleri aynı nesneye başvurmuyorsa, $ message tarafından tanımlanan bir hatayı bildirir. phpunit.de/manual/current/en/…
coviex

23

Nesne karşılaştırması söz konusu olduğunda:

assertSame: yalnızca 2 nesnenin aynı nesne örneğine başvurduğunu iddia edebilir. Dolayısıyla, 2 ayrı nesne tüm öznitelikleri için tamamen aynı değerlere sahip olsa bile, aynı örneğe başvurmazlarsa assertSame başarısız olacaktır.

    $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 ayrı nesnenin her durumda öznitelik değerleriyle eşleşip eşleşmediğini iddia edebilir. Dolayısıyla, nesne eşleşmesini iddia etmek için uygun yöntem budur.

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

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


7
Bu cevap kapsamlı olmasa da (yalnızca nesneleri kapsar), tam olarak bilmem gereken şey buydu. Teşekkürler! :)
rinogo

Evet, ama assertEquals()karşılaştırır nullve ""hatta 0eşit olarak.
Danon

20
$this->assertEquals(3, true);
$this->assertSame(3, true);

İlki geçecek!

İkincisi başarısız olacak.

Aradaki fark bu.

Her zaman assertSame kullanmanız gerektiğini düşünüyorum.


Bunu test odaklı geliştirme sırasında aldım. test geçti, 3 değerinin döndürüldüğünü varsaydı, ancak gerçekte true döndü. ilginç bir şekilde $ this-> assertEquals ('3', true); başarısız olur.
dwenaus

3

Daha önce de söylendiği gibi AssertSame, iki öğe türü ve değeri paylaşmıyorsa bir hata bildirir , ancak bunu dokümantasyondan not etmek de önemlidir :

$ Beklenen ve $ gerçek değişkenleri aynı nesneye başvurmuyorsa, $ message tarafından tanımlanan bir hatayı bildirir.

Dolayısıyla bu test, aynı türü ve değeri paylaşsalar bile başarısız olacaktır:

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

1

Dahası,

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

0

assertSame () == Gerçek çıktının ve beklenen parametrenin aynı olup olmadığını test eder.

yani :

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

veya

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

assertEquals == Bir web sitesi sayfasıyla ilgili olarak görürsek, 2 'table' olan bir sayfam var, bu yüzden assertEquals'ı çalıştırdığımda, bir sayma işlevi kullanarak 'tablo'nun 2 olduğunu kontrol edeceğim. Örneğin:

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

Burada assertEquals'ın web sayfasında 2 tablo bulunduğunu kontrol ettiğini görebiliriz. Ayrıca, köşeli ayraç içinde '#bölüm adı' kullanarak sayfada bulunan bölümleri de kullanabiliriz.

Örneğin 2:

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

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

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

1
Lütfen kod parçalarını daha okunaklı hale getirmek için kod biçimlendirmesini kullanın ve #bir başlık yapmak istemediğiniz sürece işaretleme kullanmaktan kaçının .
laalto

0

Daha önce belirtildiği gibi assertEquals(), esasen yorumlanmış bir değerle ilgilidir, bu tür hokkabazlık veya __magic sunum yöntemine sahip bir nesne ( __toString()örneğin) olabilir.

assertSame()Tekli fabrikayı test etmek için iyi bir kullanım örneği .

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.