forrest79 / presenter-tester
Nette 展示器测试工具
Requires
- php: ^8.1
- nette/application: ^3.0
- nette/forms: ^3.0
- nette/security: ^3.0
- nette/tester: ^2.5
Requires (Dev)
- forrest79/phpcs: ^1.5
- forrest79/phpcs-ignores: ^0.4
- nette/mail: ^3.0 | ^4.0
- phpstan/phpstan: ^1.10
- phpstan/phpstan-strict-rules: ^1.5
README
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)
此外,还有如getResponse
或getPresenter
等方法用于访问原始数据并执行一些自定义检查。
监听器
您可以通过实现Forrest79\PresenterTester\PresenterTesterListener
接口来挂钩到某些事件。然后,例如,您可以修改测试请求或执行一些隐式结果检查。
要注册监听器,只需将其注册为DI容器中的服务(如果您使用Mango测试器基础设施,则为基础设施容器)。
身份工厂
使用身份工厂,您可以实现一个工厂,该工厂创建默认身份。工厂是一个简单的PHP回调,它接受PresenterTestRequest
并返回Nette\Security\IIdentity
。