Behat测试中使用Drupal的UserManager清理用户

Using Drupal's UserManager to clean up user in Behat test

我是 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 忽略该错误并保持 运行 的想法都将不胜感激。到目前为止没有运气。谢谢!

看来你所要做的就是更换

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

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

至少在通读 RawDrupalContext.php 之后,我觉得这是合乎逻辑的。

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

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

 /**
   * 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
  • 这只是创建了 behat 期望的对象
  • 遵循 RawDrupalContext 并最终 Drupal8::userDelete()
  • 找到了这个解决方案