2013-09-05 33 views
8

Tôi đang xem PHPUnit và những điều sau đây khiến tôi băn khoăn. Có hay không PHPUnit xử lý int. 1 và 0 là boolean? Trong thử nghiệm hiện tại của tôi, nó không.PHPUnit Assert True One (1)

Ví dụ: $this->assertTrue(preg_match('/asdf/', 'asdf'));

Trong thử nghiệm của tôi này không thành công, vì preg_match() đang trở lại int 1 hoặc 0 và chỉ bool false nếu có một lỗi.

Tôi lấy các tác phẩm sau đây, rõ ràng, vì so sánh luôn trả về giá trị bool. $this->assertTrue(preg_match('/asdf/', 'asdf') === 1);

Tôi có thiếu thứ gì đó trong preg_match của mình hoặc xác nhận của tôi để làm cho nó ... ít nghiêm ngặt hơn không?

EDIT: Không khẳng địnhTrue yêu cầu loại để khớp? Có cách nào để đưa ra quyết định kém chặt chẽ hơn không?

Trả lời

17

PHP có riêng boolean loại, giá trị của nó TRUEFALSE (case-insensitive hằng) là không giống với giá trị nguyên 1 và 0.

Khi bạn sử dụng so sánh nghiêm ngặt (===), nó không hoạt động: TRUE !== 1FALSE !== 0.

Khi bạn sử dụng loại tung hứng, TRUE được chuyển thành 1 và FALSE được chuyển thành 0 (và, ngược lại, 0 được chuyển đổi sang FALSE, bất kỳ số nguyên khác được chuyển thành TRUE). Vì vậy, TRUE == 1FALSE == 0.

Trong PHPUnit, assertTrueassertFalse là tùy thuộc vào loại, kiểm tra nghiêm ngặt. assertTrue($x) kiểm tra xem TRUE === $x, nó có giống như assertSame(TRUE, $x) và không giống như assertEquals(TRUE, $x).

Trong trường hợp của bạn, một cách tiếp cận có thể sẽ được sử dụng rõ ràng loại đúc:

$this->assertTrue((boolean)preg_match('/asdf/', 'asdf')); 

Tuy nhiên, PHPUnit xảy ra để có khẳng định chuyên dụng để kiểm tra chuỗi đối với biểu thức chính quy:

$this->assertRegExp('/asdf/', 'asdf'); 
3

Vui lòng không sử dụng một loạt các kiểm tra assertTrue hoặc assertFalse với logic thực được nhúng trong cuộc gọi hàm phức tạp khi có nhiều chức năng kiểm tra cụ thể hơn.

PHPUnit có một bộ rất lớn các xác nhận thực sự hữu ích trong trường hợp chúng không được đáp ứng. Họ cung cấp cho bạn một loạt các bối cảnh của những gì đã đi sai, giúp bạn trong gỡ lỗi.

Để kiểm tra một biểu thức chính quy, sử dụng assertRegExp() (xem http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertRegExp)

+0

này doesn' t trả lời câu hỏi của tôi, nhưng chắc chắn là một bình luận xứng đáng. Cảm ơn bạn, lưu ý. – alairock

+2

'assertTrue' không kiểm tra giá trị' true' thực sự, không phải cái gì "trung thực" là "1". – Sven

+0

Để cụ thể hơn, tôi hiểu những gì bạn đang nói là: 'assertTrue' trong PHPUnit thực hiện so sánh" ba lần ", và không phải là so sánh" gấp đôi ". (Xem 'var_dump (1 == true);' và 'var_dump (1 === true);' Giá trị đầu tiên trả về true và giá trị thứ hai trả về false, vì "ba bằng" cũng khớp với kiểu. Tôi sẽ chỉnh sửa bản gốc để cụ thể. – alairock

Các vấn đề liên quan