驗證測試資料 expect()
toBe()
確認兩個值是否相等。
expect(1)->toBe(1);
expect('1')->not->toBe(1);
expect(new StdClass())->not->toBe(new StdClass());
toBeBetween()
確認值是否在指定範圍內。
expect(2)->toBeBetween(1, 3);
expect(1.5)->toBeBetween(1, 2);
$expectationDate = new DateTime('2023-09-22');
$oldestDate = new DateTime('2023-09-21');
$latestDate = new DateTime('2023-09-23');
expect($expectationDate)->toBeBetween($oldestDate, $latestDate);
toBeEmpty()
確認值是否為空。
expect('')->toBeEmpty();
expect([])->toBeEmpty();
expect(null)->toBeEmpty();
toBeTrue()
確認值是否為 true。
expect(true)->toBeTrue();
expect(false)->not->toBeTrue();
toBeTruthy()
確認值是否為 true。
expect(true)->toBeTruthy();
expect(false)->not->toBeTruthy();
expect(1)->toBeTruthy();
expect('1')->toBeTruthy();
toBeFalse()
確認值是否為 false。
expect(false)->toBeFalse();
expect(true)->not->toBeFalse();
toBeFalsy()
確認值是否為 false。
expect(false)->toBeFalsy();
expect(true)->not->toBeFalsy();
expect(0)->toBeFalsy();
expect('')->toBeFalsy();
toBeGreaterThan($expected)
確認值是否大於指定值。
expect(2)->toBeGreaterThan(1);
expect(1)->not->toBeGreaterThan(2);
toBeGreaterThanOrEqual($expected)
確認值是否大於或等於指定值。
expect(2)->toBeGreaterThanOrEqual(2);
expect(1)->not->toBeGreaterThanOrEqual(2);
toBeLessThan($expected)
確認值是否小於指定值。
expect(1)->toBeLessThan(2);
expect(2)->not->toBeLessThan(1);
toBeLessThanOrEqual($expected)
確認值是否小於或等於指定值。
expect(1)->toBeLessThanOrEqual(2);
expect(2)->toBeLessThanOrEqual(2);
expect(3)->not->toBeLessThanOrEqual(2);
toContain($needles)
確認值是否包含指定值。
expect('Hello World')->toContain('Hello');
expect('Pest: an elegant PHP Testing Framework')->toContain('Pest', 'PHP', 'Framework');
expect([1, 2, 3])->toContain(2);
expect([1, 2, 3, 4])->toContain(2, 4);
toContainEqual($needles)
確認值是否包含指定值。
expect([1, 2, 3])->toContainEqual(2);
expect([1, 2, 3, 4])->toContainEqual(2, 4);
toContainOnlyInstancesOf($class)
確認值是否包含指定類別的實例。
$dates = [new DateTime(), new DateTime()];
expect($dates)->toContainOnlyInstancesOf(DateTime::class);
toHaveCount(int $count)
確認值的數量是否等於指定值。
expect([1, 2, 3])->toHaveCount(3);
expect([1, 2, 3])->not->toHaveCount(2);
expect(['Nuno', 'Luke', 'Alex', 'Dan'])->toHaveCount(4);
toHaveProperty(string $name, $value = null)
確認值是否包含指定屬性。
expect($user)->toHaveProperty('name');
expect($user)->toHaveProperty('name', 'Nuno');
expect($user)->toHaveProperty('is_active', 'true');
toHaveProperties(iterable $name)
確認值是否包含指定屬性。
expect($user)->toHaveProperties(['name', 'is_active']);
expect($user)->toHaveProperties(['name', 'email']);
expect($user)->toHaveProperties([
'name' => 'Nuno',
'email' => 'enunomaduro@gmail.com'
]);
toMatchArray($array)
確認值是否包含指定陣列。
expect([1, 2, 3])->toMatchArray([1, 2, 3]);
expect([1, 2, 3])->not->toMatchArray([1, 2]);
$user = [
'id' => 1,
'name' => 'Nuno',
'email' => 'enunomaduro@gmail.com',
'is_active' => true,
];
expect($user)->toMatchArray([
'email' => 'enunomaduro@gmail.com',
'name' => 'Nuno'
]);
toMatchObject($object)
確認值是否包含指定物件。
$user = new stdClass();
$user->id = 1;
$user->email = 'enunomaduro@gmail.com';
$user->name = 'Nuno';
expect($user)->toMatchObject([
'email' => 'enunomaduro@gmail.com',
'name' => 'Nuno'
]);
toEqual($expected)
確認兩個值是否相等。
expect(1)->toEqual(1);
expect(1)->not->toEqual(2);
expect($title)->toEqual('Hello World');
expect('1')->toEqual(1);
expect(new StdClass())->toEqual(new StdClass());
toEqualCanonicalizing($expected)
確認兩個值是否相等,忽略順序。
expect('Hello World')->toEqualCanonicalizing('hello world');
$usersAsc = ['Dan', 'Fabio', 'Nuno'];
$usersDesc = ['Nuno', 'Fabio', 'Dan'];
expect($usersAsc)->toEqualCanonicalizing($usersDesc);
expect($usersAsc)->not->toEqual($usersDesc);
toEqualWithDelta($expected, float $delta)
允許一定的誤差範圍。
expect($durationInMinutes)->toEqualWithDelta(10, 5); //duration of 10 minutes with 5 minutes tolerance
expect(14)->toEqualWithDelta(10, 5); // Pass
expect(14)->toEqualWithDelta(10, 0.1); // Fail
expect(1.001)->toEqualWithDelta(1, 0.01);
expect(1.001)->not->toEqualWithDelta(1, 0.001);
toBeIn()
確認值是否在指定範圍內。
expect($newUser->status)->toBeIn(['pending', 'new', 'active']);
expect(1)->toBeIn([1, 2, 3]);
expect(4)->not->toBeIn([1, 2, 3]);
toBeInfinite()
確認值是否為無限大。
expect(log(0))->toBeInfinite();
expect(INF)->toBeInfinite();
expect(-INF)->toBeInfinite();
expect(1)->not->toBeInfinite();
toBeInstanceOf($class)
確認值是否為指定類別的實例。
expect($user)->toBeInstanceOf(User::class);
expect(new DateTime())->toBeInstanceOf(DateTime::class);
expect(new stdClass())->not->toBeInstanceOf(DateTime::class);
toBeArray()
確認值是否為陣列。
expect(['Pest','PHP','Laravel'])->toBeArray();
expect([1, 2, 3])->toBeArray();
expect(new stdClass())->not->toBeArray();
toBeBool()
確認值是否為布林值。
expect(true)->toBeBool();
expect(false)->toBeBool();
expect(0)->not->toBeBool();
toBeCallable()
確認值是否為可呼叫的。
expect(fn () => 'Hello World')->toBeCallable();
expect(1)->not->toBeCallable();
$myFunction = function () {};
expect($myFunction)->toBeCallable();
toBeFile()
確認值是否為檔案。
expect('/path/to/file.txt')->toBeFile();
expect(1)->not->toBeFile();
toBeFloat()
確認值是否為浮點數。
expect(1.0)->toBeFloat();
expect(1)->not->toBeFloat();
toBeInt()
確認值是否為整數。
expect(1)->toBeInt();
expect(1.0)->not->toBeInt();
toBeIterable()
確認值是否為可迭代的。
expect([1, 2, 3])->toBeIterable();
expect(1)->not->toBeIterable();
expect($array)->toBeIterable();
toBeNumeric()
確認值是否為數字。
expect(1)->toBeNumeric();
expect('1')->toBeNumeric();
expect(1.0)->toBeNumeric();
expect(1.001)->toBeNumeric();
expect(INF)->toBeNumeric();
toBeDigits()
確認值是否為數字。
expect('12345')->toBeDigits();
expect(12345)->toBeDigits();
expect('12345a')->not->toBeDigits();
expect($year)->toBeDigits();
expect(15)->toBeDigits();
expect('15')->toBeDigits();
expect(0.123)->not->toBeDigits();
expect('0.123')->not->toBeDigits();
toBeObject()
確認值是否為物件。
expect(new stdClass())->toBeObject();
expect(1)->not->toBeObject();
toBeResource()
確認值是否為資源。
expect(fopen('/path/to/file.txt', 'r'))->toBeResource();
expect(1)->not->toBeResource();
$handle = fopen('php://memory', 'r+');
expect($handle)->toBeResource();
toBeScalar()
確認是否為純量值。
expect(1)->toBeScalar();
expect('1')->toBeScalar();
expect(1.0)->toBeScalar();
expect(INF)->toBeScalar();
expect(true)->toBeScalar();
expect([1, '1'])->not->toBeScalar();
toBeString()
確認值是否為字串。
expect('Hello World')->toBeString();
expect(1)->not->toBeString();
toBeJson()
確認值是否為 JSON 格式。
expect('{"name": "Nuno"}')->toBeJson();
expect(1)->not->toBeJson();
toBeNan()
確認值是否為 NaN。
expect(NAN)->toBeNan();
expect(1)->not->toBeNan();
expect(sqrt(-1))->toBeNan();
toBeNull()
確認值是否為 null。
expect(null)->toBeNull();
expect(0)->not->toBeNull();
toHaveKey(string $key)
確認值是否包含指定鍵。
expect($user)->toHaveKey('name');
expect($user)->toHaveKey('name', 'Nuno');
expect($user)->toHaveKey('is_active', true);
expect(['name' => 'Nuno', 'surname' => 'Maduro'])->toHaveKey('name');
expect(['name' => 'Nuno', 'surname' => 'Maduro'])->toHaveKey('name', 'Nuno');
expect(['user' => ['name' => 'Nuno', 'surname' => 'Maduro']])->toHaveKey('user.name');
expect(['user' => ['name' => 'Nuno', 'surname' => 'Maduro']])->toHaveKey('user.name', 'Nuno');
toHaveKeys(array $keys)
確認值是否包含指定鍵。
expect($user)->toHaveKeys(['name', 'is_active']);
expect($user)->toHaveKeys(['name', 'email']);
expect(['id' => 1, 'name' => 'Nuno'])->toHaveKeys(['id', 'name']);
expect(['message' => ['from' => 'Nuno', 'to' => 'Luke'] ])->toHaveKeys(['message.from', 'message.to']);
toHaveLength(int $number)
確認值的長度。
expect('Hello World')->toHaveLength(11);
expect([1, 2, 3])->toHaveLength(3);
expect(new stdClass())->not->toHaveLength(0);
expect('Pest')->toHaveLength(4);
expect(['Nuno', 'Maduro'])->toHaveLength(2);
toBeDirectory()
確認值是否為目錄。
expect('/path/to/directory')->toBeDirectory();
expect(1)->not->toBeDirectory();
expect('/tmp')->toBeDirectory();
toBeReadableDirectory()
確認值是否為可讀目錄。
expect('/path/to/directory')->toBeReadableDirectory();
expect(1)->not->toBeReadableDirectory();
expect('/tmp')->toBeReadableDirectory();
toBeReadableFile()
確認值是否為可讀檔案。
expect('/path/to/file.txt')->toBeReadableFile();
expect(1)->not->toBeReadableFile();
expect('/tmp')->not->toBeReadableFile();
toBeWritableDirectory()
確認值是否為可寫目錄。
expect('/path/to/directory')->toBeWritableDirectory();
expect(1)->not->toBeWritableDirectory();
expect('/tmp')->toBeWritableDirectory();
toBeWritableFile()
確認值是否為可寫檔案。
expect('/path/to/file.txt')->toBeWritableFile();
expect(1)->not->toBeWritableFile();
expect('/tmp')->not->toBeWritableFile();
toStartWith(string $expected)
確認值是否以指定字串開頭。
expect('Hello World')->toStartWith('Hello');
expect('Hello World')->not->toStartWith('World');
toThrow()
確認值是否拋出指定例外。
expect(fn() => throw new Exception('Error'))->toThrow(Exception::class);
expect(fn() => throw new Exception('Error'))->toThrow(Exception::class, 'Error');
expect(fn() => throw new Exception('Something happened.'))->toThrow(Exception::class);
expect(fn() => throw new Exception('Something happened.'))->toThrow('Something happened.');
expect(fn() => throw new Exception('Something happened.'))->toThrow(Exception::class, 'Something happened.');
expect(fn() => throw new Exception('Something happened.'))->toThrow(new Exception('Something happened.'));
toMatch(string $expression)
確認值是否符合正規表示式。
expect('Hello World')->toMatch('/^Hello/');
expect('Hello World')->not->toMatch('/^World/');
expect('Hello World')->toMatch('/^hello wo.*$/i');
toEndWith(string $expected)
確認值是否以指定字串結尾。
expect('Hello World')->toEndWith('World');
expect('Hello World')->not->toEndWith('Hello');
toMatchConstraint(Constraint $constraint)
確認值是否符合指定限制。
use PHPUnit\Framework\Constraint\IsTrue;
expect(true)->toMatchConstraint(new IsTrue());
toBeUppercase(string $expected)
確認值是否為大寫。
expect('HELLO WORLD')->toBeUppercase();
expect('Hello World')->not->toBeUppercase();
toBeLowercase(string $expected)
確認值是否為小寫。
expect('hello world')->toBeLowercase();
expect('Hello World')->not->toBeLowercase();
toBeAlpha(string $expected)
確認值是否為字母。
expect('Hello World')->toBeAlpha();
expect('Hello World123')->not->toBeAlpha();
toBeAlphaNumeric(string $expected)
確認值是否為字母和數字。
expect('HelloWorld123')->toBeAlphaNumeric();
expect('Hello World123')->not->toBeAlphaNumeric();
toBeSnakeCase()
確認值是否為 SnakeCase 命名。
expect('hello_world')->toBeSnakeCase();
expect('HelloWorld')->not->toBeSnakeCase();
toBeKebabCase()
確認值是否為 KebabCase 命名。
expect('hello-world')->toBeKebabCase();
expect('HelloWorld')->not->toBeKebabCase();
toBeCamelCase()
確認值是否為 CamelCase 命名。
expect('helloWorld')->toBeCamelCase();
expect('hello_world')->not->toBeCamelCase();
toBeStudlyCase()
確認值是否為 StudlyCase 命名。
expect('HelloWorld')->toBeStudlyCase();
expect('hello_world')->not->toBeStudlyCase();
toHaveSnakeCaseKeys()
確認值是否為 SnakeCase 鍵。
expect(['hello_world' => 'Hello World'])->toHaveSnakeCaseKeys();
expect(['helloWorld' => 'Hello World'])->not->toHaveSnakeCaseKeys();
toHaveKebabCaseKeys()
確認值是否為 KebabCase 鍵。
expect(['hello-world' => 'Hello World'])->toHaveKebabCaseKeys();
expect(['helloWorld' => 'Hello World'])->not->toHaveKebabCaseKeys();
toHaveCamelCaseKeys()
確認值是否為 CamelCase 鍵。
expect(['helloWorld' => 'Hello World'])->toHaveCamelCaseKeys();
expect(['hello_world' => 'Hello World'])->not->toHaveCamelCaseKeys();
toHaveStudlyCaseKeys()
確認值是否為 StudlyCase 鍵。
expect(['HelloWorld' => 'Hello World'])->toHaveStudlyCaseKeys();
expect(['hello_world' => 'Hello World'])->not->toHaveStudlyCaseKeys();
toHaveSameSize($other)
確認值的大小是否相同。
expect([1, 2, 3])->toHaveSameSize([1, 2, 3]);
expect([1, 2, 3])->not->toHaveSameSize([1, 2]);
expect(['foo', 'bar'])->toHaveSameSize(['baz', 'bazz']);
toBeUrl()
確認值是否為 URL。
expect('https://example.com')->toBeUrl();
expect('example.com')->not->toBeUrl();
toBeUuid()
確認值是否為 UUID。
expect('123e4567-e89b-12d3-a456-426614174000')->toBeUuid();
expect('123e4567-e89b-12d3-a456-426614174000')->toBeUuid('v4');
expect('123e4567-e89b-12d3-a456-426614174000')->not->toBeUuid('v3');
and($value)
串接多個限制。
expect($id)->toBe(14)
->and($name)->toBe('Nuno');
expect(1)->toEqual(1)
->and(2)->toEqual(2);
dd()
輸出並終止。
expect(1)->toEqual(1)->dd();
expect(14)->dd(); // 14
expect([1, 2])->sequence(
fn ($number) => $number->toBe(1),
fn ($number) => $number->dd(), // 2
);
ddWhen($condition)
當條件成立時,輸出並終止。
expect(14)->toEqual(14)->ddWhen(true);
expect(14)->toEqual(14)->not->ddWhen(false);
expect([1, 2])->each(
fn ($number) => $number->ddWhen(fn (int $number) => $number === 2) // 2
);
ddUnless($condition)
當條件不成立時,輸出並終止。
expect(14)->toEqual(14)->ddUnless(false);
expect(14)->toEqual(14)->not->ddUnless(true);
expect([1, 2])->each(
fn ($number) => $number->ddUnless(fn (int $number) => $number === 1) // 2
);
each()
迭代每個元素。
expect([1, 2])->each(fn ($number) => $number->toBe(1));
expect([1, 2, 3])->each->toBeInt();
expect([1, 2, 3])->each->not->toBeString();
expect([1, 2, 3])->each(fn ($number) => $number->toBeLessThan(4));
json()
確認是否為 JSON 格式。
expect('{"name":"Nuno","credit":1000.00}')
->json()
->toHaveCount(2)
->name->toBe('Nuno')
->credit->toBeFloat();
expect('not-a-json')->json(); //Fails
match()
確認是否符合條件。
expect($user->miles)
->match($user->status, [
'new' => fn ($userMiles) => $userMiles->ToBe(0),
'gold' => fn ($userMiles) => $userMiles->toBeGreaterThan(500),
'platinum' => fn ($userMiles) => $userMiles->toBeGreaterThan(1000),
]);
expect($user->default_language)
->match($user->country, [
'PT' => 'Português',
'US' => 'English',
'TR' => 'Türkçe',
]);
not
反向條件。
expect(1)->toEqual(1)->not->toEqual(2);
expect(1)->toEqual(1)->not->toBeLessThan(1);
expect(10)->not->toBeGreaterThan(100);
expect(true)->not->toBeFalse();
ray()
輸出並終止。
expect(1)->toEqual(1)->ray();
expect(14)->ray(); // 14
expect([1, 2])->sequence(
fn ($number) => $number->toBe(1),
fn ($number) => $number->ray(), // 2
);
sequence()
串接多個限制。
expect([1, 2, 3])->sequence(
fn ($number) => $number->toBe(1),
fn ($number) => $number->toBe(2),
fn ($number) => $number->toBe(3),
);
expect(['hello' => 'world', 'foo' => 'bar', 'john' => 'doe'])->sequence(
fn ($value, $key) => $value->toEqual('world'),
fn ($value, $key) => $key->toEqual('foo'),
fn ($value, $key) => $value->toBeString(),
);
expect(['foo', 'bar', 'baz'])->sequence('foo', 'bar', 'baz');
when()
條件限制。
expect(1)->when(true, fn ($value) => $value->toBe(1));
expect(1)->when(false, fn ($value) => $value->toBe(2));
expect($user)
->when($user->is_verified === true, fn ($user) => $user->daily_limit->toBeGreaterThan(10))
->email->not->toBeEmpty();
unless()
條件限制。
expect(1)->unless(false, fn ($value) => $value->toBe(1));
expect(1)->unless(true, fn ($value) => $value->toBe(2));
expect($user)
->unless($user->is_verified === true, fn ($user) => $user->daily_limit->toBe(10))
->email->not->toBeEmpty();