sirbrillig/just-the-snaps

PHP的快照测试库

dev-master 2017-11-03 22:34 UTC

This package is auto-updated.

Last update: 2024-09-20 10:58:04 UTC


README

PHP的快照测试库

这个库旨在是

  • 开发者的摩擦非常小。
  • 测试运行器无关。
  • 轻量级。

有关使用此库的PHPUnit插件的示例,请参阅phpunit-just-the-snaps

仍在开发中!API可能会更改!

安装

composer require --dev sirbrillig/just-the-snaps

通用用法

这是如何在没有任何特定测试运行器的情况下使用JustSnaps的方法。

在这个例子中,假设我们有一个名为getData()的函数,它返回一个数组,还有一个名为assertTrue()的函数,如果其表达式不是true,则会抛出异常。

$actual = getData();
$asserter = \JustSnaps\buildSnapshotAsserter('./tests/__snapshots__');
assertTrue($asserter->forTest('testThatFooIsBar')->assertMatchesSnapshot($actual));

第一次运行此代码时,将抛出CreatedSnapshotException,并序列化要测试的数据($actual),并将其保存到文件tests/__snapshots__/testThatFooIsBar.snap中。

第二次(以及随后的每次)运行此代码时,它将比较要测试的数据与快照文件的内容,并根据是否相同返回true或false。

这将防止getData()中的任何回归。

如果getData()的结果是故意更改的,则可以通过简单地删除快照文件来“重置”测试。下一次运行测试时,它将重新创建它,就像上面那样。

序列化器

JustSnaps将在写入快照文件之前对任何数据运行json_encode()。如果您的数据在写入之前需要一些操作,您可以创建自定义序列化器。

每个序列化器由两个对象组成

  1. 一个实现了SerializerTester的类,它有一个函数:shouldSerialize(mixed $data): bool。此函数必须返回true,如果序列化器应该修改数据。
  2. 一个实现了SerializerPrinter的类,它有一个函数:serializeData(mixed $data): mixed。此函数可以操作数据,然后必须返回要写入快照文件的新数据。请注意,从serializeData()返回的数据在写入之前仍将通过json_encode()传递。

以下是一个使用自定义序列化器隐藏敏感信息的示例。

$actual = [ 'foo' => 'bar', 'secret' => 'thisisasecretpassword' ];
$printer = new class implements SerializerPrinter {
	public function serializeData($outputData) {
		$outputData['secret'] = 'xxx';
		return $outputData;
	}
};
$tester = new class implements SerializerTester {
	public function shouldSerialize($outputData): bool {
		return is_array($outputData) && isset($outputData['secret']);
	}
};
$serializer = new Serializer($tester, $printer);
$asserter = \JustSnaps\buildSnapshotAsserter('./tests/__snapshots__');
$asserter->addSerializer($serializer);
assertTrue($asserter->forTest('testThatFooIsBar')->assertMatchesSnapshot($actual));