gpt4 book ai didi

testing - 如何在 Laravel 中以登录用户身份运行 Behat 测试?

转载 作者:行者123 更新时间:2023-11-28 20:20:29 24 4
gpt4 key购买 nike

我正在尝试使用 Behat 为 Laravel 应用程序创建一些测试。许多测试要求登录用户看到特定数据。我的方法是这样的:

  • 使用 Auth::loginUsingId($id) 以具有特定 ID 的用户身份登录
  • 转到我的应用程序中的特定 URL
  • 检查我期望的内容是否存在

现在,在我的 Behat 上下文中,尽管 Auth::check() 返回 true,但我设置的过滤器似乎看不到这一点。 Auth::check() 在该上下文中返回 false,因此尝试进行身份验证(通过 OAuth 与我的应用程序通信的 API)。

如何以登录用户身份测试我的应用?

我的 Behat 上下文文件,以防有帮助:

<?php

use Behat\Behat\Context\ClosuredContextInterface;
use Behat\Behat\Context\TranslatedContextInterface;
use Behat\Behat\Context\BehatContext;
use Behat\Behat\Exception\PendingException;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;

/**
* Features context.
*/
class FeatureContext extends MinkContext
{
/**
* Laravel application instance.
*
* @var Illuminate\Foundation\Application
*/
protected $app;

/**
* @static
* @beforeSuite
*/
public static function bootstrapLaravel()
{
$unitTesting = true;
$testEnvironment = true;

$app = require_once __DIR__ . '/../../../../bootstrap/start.php';
$app->boot();
}

/**
* Initializes context.
* Every scenario gets its own context object.
*
* @param array $parameters context parameters (set them up through behat.yml)
*/
public function __construct(array $parameters)
{
}

/**
* @Given /^I am logged in as user ID (\d+)$/
*/
public function iAmLoggedInAsUserId($id)
{
Auth::loginUsingId($id);
}
}

以及示例测试功能:

Feature: Sample Feature

Scenario: View groups a member is associated with
Given I am logged in as user ID 49
And I am on "/group"
Then I should see "Lorem Ipsum"

最佳答案

您遇到的问题是 iAmLoggedInAsUserId 方法直接对 laravel 框架执行调用,而您的后续指令是基于浏览器/mink 的。这就像有一个从命令行运行的 PHP 脚本,该脚本将(为了执行)登录用户设置为 123,然后转到 Web 浏览器 - 用户 123 不会在该上下文中登录。

您需要找到一种方法让基于代码的身份验证持续到您的浏览器测试。

可能的选择:

  • iAmLoggedInAsUserId 的聚合指令转到登录页面并执行登录。
  • 劫持 mink 正在使用的 session ,并更新它以登录
  • 一种仅限本地的解决方法,例如,它可以让您设置一个 header 以包含用户 ID,并且您的代码仅在本地运行时才将其用作登录用户

理想情况下,您应该编写一个测试来测试登录,但是这是结构化的(即选项 1),然后将其重新用于需要登录用户的测试。如果您的用例不允许第一个选项,那么其他两个选项只是想法。

编辑:以下是聚合指令示例,此特定版本要求用户存在于系统中。但是,您可以强制用户事先存在,如果它是作为测试的一部分添加的,则在测试完成后使用 @AfterFeature Hook 将其删除:

/**
* @Given /I am logged in with the username "([^"]*)" and password "([^"]*)"/
*/
public function loginWithEmailAndPassword($username, $password)
{
//$this->ensureUserExistsWithEmailAndPassword($email, $password);

return array(
new Behat\Behat\Context\Step\Given("I am on \"/login\""),
new Behat\Behat\Context\Step\When("I fill in \"login_username\" with \"$username\""),
new Behat\Behat\Context\Step\When("I fill in \"login_password\" with \"$password\""),
new Behat\Behat\Context\Step\When("I press \"Login\""),
new Behat\Behat\Context\Step\Then("I should see \"Welcome\"")
);
}

关于testing - 如何在 Laravel 中以登录用户身份运行 Behat 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com