sirbrillig/phpunit-just-the-snaps

PHPUnit 的轻量级快照测试插件

dev-master 2017-11-02 23:56 UTC

This package is auto-updated.

Last update: 2024-09-20 10:47:43 UTC


README

PHPUnit 的快照测试库

使用通用的快照库 just-the-snaps.

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

安装

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

用法

在您的测试类中包含 trait SnapshotAsserter 以获取该包的方法。

use PHPUnitJustSnaps\SnapshotAsserter;

class MyTest extends \PHPUnit\Framework\TestCase {
	use SnapshotAsserter;
}

在此示例中,假设我们有一个名为 getData() 的函数,它返回一个数组。

public function testDataHasNotChanged() {
	$actual = getData();
	$this->assertMatchesSnapshot($actual);
}

首次运行此代码时,测试将被标记为“跳过”,并且要测试的数据($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() 传递。注意,从 serializeData() 返回的数据将在写入之前通过 json_encode() 传递。

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

use JustSnaps\SerializerPrinter;
use JustSnaps\SerializerTester;
use JustSnaps\Serializer;

public function addSecretSerializer() {
	$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']);
		}
	};
	$this->addSnapshotSerializer(new Serializer($tester, $printer));
}

public function testDataHasNotChanged() {
	$actual = [ 'foo' => 'bar', 'secret' => 'thisisasecretpassword' ];
	$this->addSecretSerializer();
	$this->assertMatchesSnapshot($actual);
}

类似的项目