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()
找到了这个解决方案
我是 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()
找到了这个解决方案