sepehr/behat-laravel-js

使用 Laravel 和 Behat 测试 JavaScript 应用程序。

0.1.1 2017-02-23 21:42 UTC

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 特质,而不是使用 DatabaseTransactionsMigrator 特质。

非常流行的 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);
        }
    }
    
    // ...
}