断言

Testing Is Documentation

tests/Validate/AssertTest.php断言 - 图1

这里为系统提供的基础的断言功能,断言的规则与验证器共享校验规则。

Uses

  1. <?php
  2. use Leevel\Validate\Assert;
  3. use Leevel\Validate\AssertException;

基本断言测试

断言和验证器共享规则,所以可以直接参考验证器有哪些规则,排查掉依赖验证器自身的校验规则。

支持格式

  1. Assert::foo($value, string $message);
  2. Assert::foo($value, array $param, string $message);
  1. public function testBaseUse(): void
  2. {
  3. Assert::notEmpty(1);
  4. Assert::notEmpty(55);
  5. Assert::notEmpty(66);
  6. Assert::lessThan(4, [5]);
  7. $this->assertSame(1, 1);
  8. }

断言失败默认错误消息

  1. public function testAssertFailedWithDefaultMessage(): void
  2. {
  3. $this->expectException(\Leevel\Validate\AssertException::class);
  4. $this->expectExceptionMessage(
  5. 'No exception messsage specified.'
  6. );
  7. Assert::notEmpty(0);
  8. }

断言失败自定义消息

  1. public function testAssertFailedWithCustomMessage(): void
  2. {
  3. $this->expectException(\Leevel\Validate\AssertException::class);
  4. $this->expectExceptionMessage(
  5. 'No exception messsage specified.'
  6. );
  7. Assert::notEmpty(0);
  8. }

可选断言支持

如果值为 null 直接返回正确结果。

  1. public function testAssertOptional(): void
  2. {
  3. Assert::optionalNotEmpty(null);
  4. $this->assertSame(1, 1);
  5. }

可选断言失败

  1. public function testAssertOptionalFailed(): void
  2. {
  3. $this->expectException(\Leevel\Validate\AssertException::class);
  4. $this->expectExceptionMessage(
  5. 'No exception messsage specified.'
  6. );
  7. Assert::optionalNotEmpty(0);
  8. }

断言支持多个校验

必须每一个都满足规则才算校验成功。

  1. public function testAssertMulti(): void
  2. {
  3. Assert::multiNotEmpty([3, ['hello'], 'bar', 'yes']);
  4. $this->assertSame(1, 1);
  5. }

断言支持多个校验

必须每一个都满足规则才算校验成功。

  1. public function testAssertMultiFailed(): void
  2. {
  3. $this->expectException(\Leevel\Validate\AssertException::class);
  4. $this->expectExceptionMessage(
  5. 'No exception messsage specified.'
  6. );
  7. Assert::multiNotEmpty([3, ['hello'], '', 'yes']);
  8. }

断言支持多个校验也支持可选

必须每一个都满足规则才算校验成功, 可选会跳过验证,可选必须在最前面,即不支持 multiOptional 这种写法。

  1. public function testAssertMultiWithOptional(): void
  2. {
  3. Assert::optionalMultiNotEmpty([null, ['hello'], 'bar', 'yes', null]);
  4. $this->assertSame(1, 1);
  5. }

断言支持链式表达式

我们可以使用链式表达式来校验规则。

make 原型

  1. Assert::make($value, ?string $message)

第一个参数为待校验的值,第二个为默认校验失败消息,每一条验证规则也支持自己的失败消息。

  1. public function testAssertChain(): void
  2. {
  3. Assert::make(5, 'Assert success.')
  4. ->notEmpty()
  5. ->lessThan([7]);
  6. $this->assertSame(1, 1);
  7. }

断言支持延迟释放

可以将所有错误几种抛出。

lazy 原型

  1. Assert::lazy($value, ?string $message, bool $all = true)

第一个参数为待校验的值,第二个为默认校验失败消息,第三个为是否全部验证,每一条验证规则也支持自己的失败消息。

  1. public function testAssertLazyChain(): void
  2. {
  3. $result = Assert::lazy(5, 'Assert success.')
  4. ->notEmpty()
  5. ->lessThan([7], '5 not less than 3')
  6. ->lessThan([8], '5 not less than 4')
  7. ->lessThan([9], '5 not less than 2')
  8. ->flush();
  9. $this->assert($result);
  10. }

断言失败延迟释放

  1. public function testAssertLazyChainFailed(): void
  2. {
  3. $this->expectException(\Leevel\Validate\AssertException::class);
  4. $this->expectExceptionMessage(
  5. '["5 not less than 3","5 not less than 4","5 not less than 2"]'
  6. );
  7. Assert::lazy(5, 'Assert success.')
  8. ->notEmpty()
  9. ->lessThan([3], '5 not less than 3')
  10. ->lessThan([4], '5 not less than 4')
  11. ->lessThan([2], '5 not less than 2')
  12. ->flush();
  13. }

断言失败延迟释放自定义格式化

  1. public function testAssertLazyChainFailedWithCustomFormat(): void
  2. {
  3. $this->expectException(\Leevel\Validate\AssertException::class);
  4. $this->expectExceptionMessage(
  5. '5 not less than 3'.PHP_EOL.
  6. '5 not less than 4'.PHP_EOL.
  7. '5 not less than 2'
  8. );
  9. Assert::lazy(5, 'Assert success.')
  10. ->notEmpty()
  11. ->lessThan([3], '5 not less than 3')
  12. ->lessThan([4], '5 not less than 4')
  13. ->lessThan([2], '5 not less than 2')
  14. ->flush(function (array $error): string {
  15. return implode(PHP_EOL, $error);
  16. });
  17. }