PHPUnit bazı dahili ardışık dizi karşılaştırma işlevi var mı?

4 Cevap php

Yapmam gereken test Bazı ben çalışıyor olacak fonksiyonlardan alıyorum sonucu ile bilinen bir dizi karşılaştırma gerektirir.

Recursively dizileri karşılaştırmak için:

  • PHPUnit bir dahili işlevi var mı?
  • Burada birileri paylaşmak için inşa bazı kod var mı?
  • Bu benim kendi üzerinde inşa etmek olacak bir şey olacak mı?

4 Cevap

Evet öyle. PHPUnit API Assert.

Özellikle:

void assertEquals(array $expected, array $actual)

Reports an error if the two arrays $expected and $actual are not equal.

void assertEquals(array $expected, array $actual, string $message)

Reports an error identified by $message if the two arrays $expected and $actual are not equal.

void assertNotEquals(array $expected, array $actual)

Reports an error if the two arrays $expected and $actual are equal.

void assertNotEquals(array $expected, array $actual, string $message)

Reports an error identified by $message if the two arrays $expected and $actual are equal.

Testi Kodu:

public function testArraysEqual() {
    $arr1 = array( 'hello' => 'a', 'goodbye' => 'b');
    $arr2 = array( 'hello' => 'a', 'goodbye' => 'b');

    $this->assertEquals($arr1, $arr2);
}

public function testArraysNotEqual() {
    $arr1 = array( 'hello' => 'a', 'goodbye' => 'b');
    $arr2 = array( 'hello' => 'b', 'goodbye' => 'a');

    $this->assertNotEquals($arr1, $arr2);
}

[EDIT]

Burada sipariş aLists dışında için kodu:

public function testArraysEqualReverse() {
    $arr1 = array( 'hello' => 'a', 'goodbye' => 'b');
    $arr2 = array( 'goodbye' => 'b', 'hello' => 'a');

    $this->assertEquals($arr1, $arr2);
}

Bu test başarısız olur:

public function testArraysOutOfOrderEqual() {
    $arr1 = array( 'a', 'b');
    $arr2 = array( 'b', 'a');

    $this->assertEquals($arr1, $arr2);
}

Mesajı ile:

Failed asserting that 
Array
(
    [0] => b
    [1] => a
)
 is equal to 
Array
(
    [0] => a
    [1] => b
)

Ben tuşları ile oluşturulmuş bazı diziler ile bu sorunu vardı - Ben beklenen dizi ve assertEquals çağırmadan önce ksort yoluyla test edilen dizi hem geçirerek sona erdi. Bu olsa da, özyinelemeli diziler üzerinde çalışmaz.

$expectedArray = array('foo' => 1, 'bar' => 0);
$array = array('bar' => 0, 'foo' => 1);

ksort($expectedArray);
ksort($array);

var_dump($expectedArray); // outputs array('bar' => 0, 'foo' => 1);
var_dump($array); // outputs array('bar' => 0, 'foo' => 1);

$this->assertEquals($expectedArray, $array); // passes

@ Wilmoore

$array1 = array('hi','hi2');
$array2 = array('hi2','hi');
$this->assertEquals(array_values($array1), array_values($array2));

Başarısız olur.

@ Ben Dauphinee

Bu assertContains(mixed $needle, array $haystack) bakarak değer olabilir ama her iki dizide döngü var ve tüm gerekli unsurları ve hiçbir diğerleri içerdiği sağlamak için diğer dizi her öğe karşılaştırmak istiyorsunuz, bu ancak bir hesap olmaz iki özdeş elemanları ihtiva eden bir dizi

$array1 = array('hi','hi2','hi');
$array2 = array('hi2','hi');

Bu durumda geçecek

Ayrıca muhtemelen oldukça uğraşmak karmaşık olacaktır başka yineleme için hesap değil.

Karmaşıklığına bağlı olarak sadece kendi assert fonksiyonu uygulamak için uzun vadede daha kolay olabilir.

assertEqual yöntemi kafa bu gibi görünüyor:

public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)

Canonicalize parametresi true olarak ayarlanırsa diziler anahtarları keyfi ve sadece değerler konulardır ise sort() ilk, bu kullanışlı üzerinden çalıştırmak olacaktır.

Ancak dizi karşılaştırma kod üzerinde baktıktan sonra, assertEqual aslında basitçe sonuç dizide beklenen anahtar aramak olacak :) ilişkili bir dizi sırasına umurumda, ve daha sonra bu değerlerini karşılaştırın yok tuşları.