2010-05-30 23 views
18

Một số thử nghiệm tôi sẽ cần làm sẽ yêu cầu so sánh một mảng đã biết với kết quả tôi nhận được từ các hàm tôi sẽ chạy.PHPUnit có một số chức năng so sánh mảng đệ quy sẵn có không?

Đối với so sánh mảng đệ quy:

  • Liệu PHPUnit có một chức năng sẵn có?
  • Có ai đó ở đây có một số mã họ đã xây dựng để chia sẻ không?
  • Đây có phải là thứ tôi sẽ phải tự xây dựng không?

Trả lời

19

Có. assertEquals() and assertNotEquals() documentation.

Cụ thể:

assertEquals()

assertEquals(mixed $expected, mixed $actual[, string $message = '']) 

Báo cáo một lỗi xác định bởi $message nếu hai biến $expected$actual không bằng nhau.

assertNotEquals() là nghịch đảo của xác nhận này và có cùng các đối số.

Mã kiểm tra:

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]

Đây là mã cho ra khỏi aLists theo thứ tự:

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

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

kiện dưới đây sai:

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

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

Với thông điệp:

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

Đây có phải là một chức năng mà đòi hỏi các mảng được so sánh được chính xác phím theo thứ tự cho khóa? –

+0

Câu hỏi thú vị ... – Gutzofter

+0

Vì vậy, nếu tôi muốn thử nghiệm một mảng không phù hợp với một hàng hóa đã biết, tôi sẽ phải đảm bảo các phím khớp, nhưng đó là cảnh báo duy nhất? Cảm ơn đã giúp đỡ! –

3

@wilmoore

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

sẽ thất bại.

@Ben Dauphinee

Nó có thể là giá trị xem xét assertContains(mixed $needle, array $haystack) nhưng bạn sẽ phải lặp qua cả hai mảng và so sánh từng phần tử với các mảng khác để đảm bảo nó chứa đựng tất cả các yếu tố cần thiết và không có những người khác, điều này tuy nhiên wouldn 'tài khoản t cho một mảng chứa hai yếu tố giống hệt

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

sẽ vượt qua trong trường hợp này

Nó cũng không chiếm bất kỳ đệ quy hơn nữa mà có lẽ sẽ được khá complica ted để đối phó với.

Tùy thuộc vào độ phức tạp có thể dễ dàng hơn trong thời gian dài để thực hiện chức năng xác nhận của riêng bạn.

+0

thực sự, kỹ thuật 'array_values' sẽ không hoạt động. Đó là những năm trước khi tôi đăng tải vì vậy tôi không hoàn toàn nhớ lại lý do tại sao điều này được khẳng định. –

1

Tôi đã gặp sự cố này với một số mảng được tạo bằng khóa - tôi đã chuyển cả mảng dự kiến ​​và mảng đang được kiểm tra qua ksort trước khi gọi assertEquals. Tuy nhiên, điều này không hoạt động trên các mảng đệ quy.

$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 
1

Các assertEqual phương pháp đầu trông như thế này:

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

Nếu tham số hợp quy tắc được thiết lập là true các mảng sẽ được chạy qua sort() đầu tiên, đây là có thể sử dụng nếu các phím là độc đoán và chỉ giá trị quan trọng.

Tuy nhiên sau khi xem xét mã so sánh mảng, assertEqual thực sự không quan tâm đến thứ tự của mảng được liên kết :) Nó sẽ tìm kiếm khóa mong muốn trong mảng kết quả, sau đó so sánh giá trị của các khóa đó.

-1

Đôi khi tôi làm điều đó như thế này:

$arrayResult = [....]; 
$arrayExpected = [....]; 

ksort($arrayResult); // or sort() for associative arrays 
ksort($arrayExpected); 

self::assertSame($arrayExpected, $arrayResult); 
Các vấn đề liên quan