sepehr / behat-laravel-js
使用 Laravel 和 Behat 测试 JavaScript 应用程序。
Requires
- laracasts/behat-laravel-extension: dev-master
This package is not auto-updated.
Last update: 2024-09-28 20:14:46 UTC
README
这是 Behat 的 Laravel 扩展的配套包,该扩展提供了处理在浏览器模拟器(如 Selenium、PhantomJS 或 Zombie)测试 JavaScript 应用程序时遇到的一些问题和限制的实用工具。
本包中使用的解决方案受到了 Laravel Dusk 代码的很大启发。如果您想了解更多关于问题历史的信息,请阅读 这篇帖子。
问题和解决方案
如果您已经了解扩展的限制,那么您可能已经知道了;但即使您不知道,请继续阅读。
tl;dr
安装,并在您的 FeatureContext
中使用这三个特质,您就完成了。请记住不要使用 DatabaseTransactions
和/或 Migrator
特质。
<?php use Laracasts\Behat\Context\MigrateRefresh; use Sepehr\BehatLaravelJs\Concerns\AuthenticateUsers; use Sepehr\BehatLaravelJs\Concerns\PreserveBehatEnvironment; class FeatureContext extends MinkContext implements Context { use PreserveBehatEnvironment, AuthenticateUsers, MigrateRefresh; // ... }
环境
为了减轻这个问题,您需要在您的
FeatureContext
类中使用\Sepehr\BehatLaravelJs\Concerns\PreserveBehatEnvironment
特质。
考虑以下示例:您的测试环境设置为使用 SQLite 作为数据库,而您的本地/生产环境使用 MySQL。当您运行一个 @javascript
Behat 场景时,浏览器模拟器向您的 Laravel 应用程序端点发送请求。令您惊讶的是,它遇到了另一个使用 .env
文件的 Laravel 实例。一个在不同的环境中运行实例:不同的数据库、缓存驱动程序、队列等。
数据库事务
为了解决这个问题,您需要在您的
FeatureContext
类中使用Laracasts\Behat\Context\MigrateRefresh
特质,而不是使用DatabaseTransactions
和Migrator
特质。
非常流行的 DatabaseTransactions
特质及其 BLE 对应物,在场景开始之前开始一个事务。只有在没有异常的情况下,事务才会提交。然后在场景之后,它们将回滚以保持数据库状态不变。
在过程中间,当浏览器模拟器向另一个 Laravel 实例发送请求时,事务将不会提交,因此您将遇到意外结果。
考虑一个场景,在测试实例中首先向数据库中插入一些测试用户,然后在下一步中
请求一个页面(到另一个实例),以查看其数据是否存在于页面上。令您惊讶的是,您要找的数据不可用。
相反,为了保持数据库状态的清洁,在使用 MigrateRefresh
特质在每个场景之前刷新数据库。
身份验证
为了解决这个问题,您应该在您的
FeatureContext
类中使用\Sepehr\BehatLaravelJs\Concerns\AuthenticateUsers
特质。它将为您提供登录、登出和获取当前用户数据的辅助身份验证方法。
身份验证是另一个问题。在测试环境中,您将用户登录到系统中,然后告诉 Behat 启动一个 Selenium 会话并检查受保护的页面。如您所知,用户将不会登录。测试浏览器没有身份验证cookie可以发送到另一个 Laravel 实例。
可用方法与 Dusk 相同。
安装
使用composer安装此包
composer install sepehr/behat-laravel-js
然后,在你的AppServiceProvider::boot()
方法中,为测试环境注册包的服务提供者。请注意,如果在生产环境中启用此功能,将存在一个安全风险。请查看包的服务提供者以了解原因。
<?php class AppServiceProvider extends ServiceProvider { public function boot() { if ($this->app->environment('local', 'testing', 'acceptance')) { $this->app->register(\Sepehr\BehatLaravelJs\ServiceProvider::class); } } // ... }