forrest79/presenter-tester

Nette 展示器测试工具

v0.5.0 2024-02-21 00:26 UTC

This package is auto-updated.

Last update: 2024-09-13 20:35:15 UTC


README

Latest Stable Version Monthly Downloads License Build

Mango Presenter Tester 仅用于个人用途的分支,并进行了一些调整。

具有易于使用的 API 的 Nette 展示器测试工具。

安装

建议使用 Composer 进行安装

composer require --dev forrest79/presenter-tester

需要 PHP 版本 8.1。

集成与配置

如果您在测试中使用了 Nette DI 容器的强大功能,您可以在当前的测试环境中使用 Presenter Tester。您只需要在测试的 .neon 配置中注册 PresenterTester 服务。

services:
	- Forrest79\PresenterTester\PresenterTester(baseUrl: "http://my-app.test")

您还可以指定一个 监听器 列表

parameters:
	baseUrl: 'http://my-app.dev'

services:
	- Forrest79\PresenterTester\PresenterTester(
		baseUrl: %baseUrl%
		listeners: [
			MyListener()
		]
	)

用法

从 DI 容器获取 PresenterTester 服务。当您获取到服务时,您就可以开始测试您的展示器了

$testRequest = $presenterTester->createRequest('Admin:Article')
	->withParameters([
		'action' => 'edit',
		'id' => 1,
	]);
$testResult = $presenterTester->execute($testRequet);
$testResult->assertRenders('%A%Hello world article editation%A%');

如您所见,您首先使用 PresenterTester 上的 createRequest 方法创建一个 TestPresenterRequest。您传递一个展示器名称(不带动作),然后配置测试请求。您可以设置额外的请求参数,如 action 或您自己的应用程序参数。您还可以在请求上配置许多其他内容,如表单值或头信息。

配置测试请求后,将其传递给 execute 方法,该方法执行展示器并返回 TestPresenterResult,它包装了 Nette\Application\IResponse 并在执行过程中收集了一些额外数据。

TestPresenterResult 包含许多有用的断言函数,如渲染检查或表单有效性检查。在我们的例子中,有 assertRenders 方法,它断言展示器返回 TextResponse 且文本包含指定的模式。您可能已经从 Tester\Assert::match() 函数中了解了模式格式。

辅助工具

MemorySessionHandler

为了绕过 PHP 会话,您可以将其用于测试仅保存会话到内存。为此,只需在运行测试之前调用此方法即可

Forrest79\PresenterTester\Helpers\MemorySessionHandler::install();

或者使用模拟的 Session

模拟

一些模拟来自 https://github.com/mangoweb-backend/tester-http-mocks

Http\Request

为了正确设置 SameSite 甜饼,您需要重新定义测试中的 Http\Request。您可以使用 Nette 的原始一个

services:
	http.request: Nette\Http\Request(
		url: Nette\Http\UrlScript(%baseUrl%)
		cookies: ['_nss': true] # Nette\Http\Helpers::STRICT_COOKIE_NAME
		remoteAddress: '255.254.253.252' # you can set also some other values, for example, REMOTE_ADDRESS
	)

或者您可以使用这样的模拟 Http\Request

services:
	http.request: Forrest79\PresenterTester\Mocks\Http\Request(
		url: Nette\Http\UrlScript('http://my-app.dev')
		remoteAddress: '255.254.253.252' # you can set also some other values, for example, REMOTE_ADDRESS
	)

Http\Response

如果您想测试发送的甜饼,请使用模拟的 Http\Response

services:
	http.response:
		factory: Forrest79\PresenterTester\Mocks\Http\Response
		alteration: true

然后从 DI 容器获取 Forrest79\PresenterTester\Mocks\Http\Response 服务并使用 getCookies() 方法读取甜饼。

Http\Session

模拟测试会话。当您使用它时,您不需要安装 MemorySessionHandler

services:
	session.session:
		factory: Forrest79\PresenterTester\Mocks\Http\Session

Mail\Mailer

模拟邮件发送器。所有通过 Nette\Mail 发送的邮件都保存在内存中,您可以在测试中进行检查。

services:
	mail.mailer:
		factory: Forrest79\PresenterTester\Mocks\Mail\Mailer
		alteration: true

然后从 DI 容器获取 Forrest79\PresenterTester\Mocks\Mail\Mailer 服务并使用 getLastMessage() 方法读取最后一条消息,使用 getMessages() 方法读取所有消息,或使用 count() 方法检查发送的邮件数量或使用 Countable 接口。

TestPresenterRequest API

请注意,TestPresenterRequest 是一个不可变对象。

withParameters(array $parameters)

设置应用程序请求参数。

withForm(string $formName, array $post, array $files)

将表单提交数据添加到请求中。您必须在 $formName 中指定完整的组件树路径。

演示器测试器支持带有CSRF保护表单,但由于它使用会话,建议安装mangoweb/tester-http-mocks软件包。

withSignal(string $signal, array $componentParameters = [])

使用演示器测试器,您还可以轻松测试信号方法。

withAjax

信号通常使用AJAX,您可以使用此方法启用。

withMethod(string $methodName)

更改HTTP方法。默认为GET。对于表单,您不必显式设置方法。

withHeaders(array $headers)

传递额外的HTTP头。

withIdentity(Nette\Security\IIdentity $identity)

更改执行给定请求的用户身份。这在需要登录执行操作时很有用。您可以实现身份工厂,为每个请求提供默认身份。

withPost(array $post)

withFiles(array $files)

withRawBody(string$rawBody)

测试演示器结果API

它是测试执行的结果。它包装了Nette\Application\IResponse并添加了一些方法以轻松检查响应。

assertRenders($match)

检查响应是否为TextResponse。您还可以提供$match参数来检查响应是否包含某些文本。您可以传递模式或一个数组纯字符串。

assertNotRenders($matches)

检查给定的模式或字符串未被渲染。

assertJson($expected)

检查响应是否为JSON。您可以选择传递预期的有效载荷。

assertBadRequest($code)

检查请求因不良请求异常(例如,404未找到)而终止。

assertRedirects(string $presenterName, array $parameters)

检查请求重定向到指定的演示器。您还可以传递参数进行检查。重定向请求中的额外参数将被忽略。

assertRedirectsUrl($url)

assertFormValid($formName)

assertFormHasErrors($formName, $formErrors)

此外,还有如getResponsegetPresenter等方法用于访问原始数据并执行一些自定义检查。

监听器

您可以通过实现Forrest79\PresenterTester\PresenterTesterListener接口来挂钩到某些事件。然后,例如,您可以修改测试请求或执行一些隐式结果检查。

要注册监听器,只需将其注册为DI容器中的服务(如果您使用Mango测试器基础设施,则为基础设施容器)。

身份工厂

使用身份工厂,您可以实现一个工厂,该工厂创建默认身份。工厂是一个简单的PHP回调,它接受PresenterTestRequest并返回Nette\Security\IIdentity