【问题标题】:Using Drupal's UserManager to clean up user in Behat test在 Behat 测试中使用 Drupal 的 UserManager 清理用户
【发布时间】:2018-06-02 03:16:56
【问题描述】:

我是 Behat 的新手,正在尝试让这个测试在 Behat 3.4.3 版中正常工作。

001 Scenario: Staff users can create accounts             # features/user.feature:9
  And I register "byron@poetsforever.com" for cleanup # features/user.feature:21
    16384: Interacting directly with the RawDrupalContext::$users property has been deprecated.
    Use RawDrupalContext::getUserManager->getUsers() instead. in /home/vagrant/.composer/vendor/drupal/drupal-extension/src/Drupal/DrupalExtension/Context/RawDrupalContext.php line 152

我认为这是我的 FeatureContext.php 中的违规步骤:

/**
 * @When I register :email for cleanup
 */


public function registerUserByEmailForCleanup($email) {
    // User must exist or this will throw an error.
    $user = $this->userLoadByEmail($email);
    $this->users[$user->name] = $user;
  }

任何有关如何将其转换为更新步骤以修复弃用错误的指针,或有关如何让 Behat 忽略错误并继续运行的想法将不胜感激。到目前为止还没有运气。谢谢!

【问题讨论】:

  • 如果您的上下文扩展了RawDrupalContext,那么该警告是由$this->users[$user->name] = $user; 引起的。您的FeatureContext 是否扩展了RawDrupalContext

标签: php drupal bdd behat


【解决方案1】:

看来你要做的就是替换

$this->users[$user->name] = $user;

$this->getUserManager()->addUser($user);

至少在阅读RawDrupalContext.php 后,这对我来说是合乎逻辑的。

【讨论】:

    【解决方案2】:

    我在允许手动创建用户的表单中遇到了完全相同的问题。尚不清楚 behat 如何处理实体,但它最终使用的是 \stdClass 而不是您所期望的 User 类:

    这是我们用来完成的代码和小黄瓜语法:

     /**
       * Create a user and register with Behat for cleanup.
       *
       * Let behat know we manually created a user so it can clean it up in its
       * AfterScenario hook.
       *
       * @TODO: Is there no existing method for this step??
       *
       * @Then I have manually created :username
       */
      public function manuallyCreatedUser($username) {
        $user = user_load_by_name($username);
        if ($user) {
          $user_obj = (object) array(
            'name' => $username,
            'uid' => $user->id(),
            'pass' => '',
            'mail' => $user->getEmail(),
            'role' => implode(",", $user->getRoles()),
          );
          $this->users[$username] = $user_obj;
        }
      }
    

    这里发生了一些事情:

    • Behat 没有使用User 对象来跟踪,而是使用带有属性的\stdClass
    • 这只是创建了行为所期望的对象
    • 跟随RawDrupalContext 最终找到了这个解决方案@ 987654327@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多