Unit testing 如何在Drupal8的单元测试中设置自定义字段
我试图测试与用户实体上的自定义字段相关的方法的功能。 当我试图在单元测试的设置方法中设置这些字段的值时,我得到一个错误:Field*未知 我的初始测试如下所示:Unit testing 如何在Drupal8的单元测试中设置自定义字段,unit-testing,drupal-8,Unit Testing,Drupal 8,我试图测试与用户实体上的自定义字段相关的方法的功能。 当我试图在单元测试的设置方法中设置这些字段的值时,我得到一个错误:Field*未知 我的初始测试如下所示: namespace Drupal\my_module\Entity; use Drupal\Tests\BrowserTestBase; class UserTest extends BrowserTestBase { /** @var \Drupal\my_module\Entity\User|false */ prote
namespace Drupal\my_module\Entity;
use Drupal\Tests\BrowserTestBase;
class UserTest extends BrowserTestBase
{
/** @var \Drupal\my_module\Entity\User|false */
protected $user;
protected static $modules = ['field', 'user', 'commerce_payment', 'my_module'];
protected $strictConfigSchema = FALSE;
public function setUp() {
parent::setUp();
$this->user = $this->drupalCreateUser();
$this->user->addRole('member');
$this->user->set('field_user_abc', [['value' => '123']]);
}
public function testInstance1() {
$this->assertNotEmpty($this->user->get('field_user_abc')->get(0)->getValue());
}
}
setup方法中的->set()调用失败
我真的不明白,如果Drupal是用我的项目数据库引导的,为什么我需要重新创建这个字段。然而,我在一些相关的帖子中读到,情况可能就是这样。按照/core/modules/user/tests/src/Functional/UserCreateTest.php中的示例,我尝试了以下操作,但结果是一样的
namespace Drupal\my_module\Entity;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Tests\BrowserTestBase;
class UserTest extends BrowserTestBase
{
protected $user;
protected static $modules = ['field', 'user', 'commerce_payment', 'my_module'];
protected $strictConfigSchema = FALSE;
public function setUp() {
parent::setUp();
$this->user = $this->drupalCreateUser();
$this->user->addRole('member');
$this->drupalLogin($this->user);
// Create a field.
$field_name = 'field_user_abc';
FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => 'user',
'module' => 'core',
'type' => 'string',
'cardinality' => 1,
'locked' => FALSE,
'indexes' => [],
'settings' => [
'max_length' => 14,
'is_ascii' => false,
'case_sensitive' => false,
],
])->save();
FieldConfig::create([
'field_name' => $field_name,
'entity_type' => 'user',
'label' => 'ABC',
'bundle' => 'user',
'description' => '',
'required' => FALSE,
'settings' => [],
])->save();
$this->user->set($field_name, [['value' => '123']]);
}
public function testInstance1() {
$this->assertNotEmpty($this->user->get('field_user_abc')->get(0)->getValue());
}
}
这是因为您的存储类型设置为
string
,而不是text
您还应该删除“模块”=>“核心”
,并在模块依赖项中添加文本
protected static $modules = ['field', 'text', 'user', 'commerce_payment', 'my_module'];
FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => 'user',
'type' => 'text',
'cardinality' => 1,
'locked' => FALSE,
'indexes' => [],
'settings' => [
'max_length' => 14,
'is_ascii' => false,
'case_sensitive' => false,
],
])->save();
这将导致数据库中出现varchar(14)
导出配置后,field.storage.user.field\u user\u abc.yml将如下所示:
uuid: 2656c022-1ff2-4868-b07d-c26ff3531aac
langcode: fr
status: true
dependencies:
module:
- text
- user
id: user.field_user_abc
field_name: field_user_abc
entity_type: user
type: text
settings:
max_length: 14
is_ascii: false
case_sensitive: false
module: text
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false
我试着把它改成文本,但没有任何效果。该指令指的是值应如何存储在数据库中,因此“string”类型有意义,而“text”类型通常用于可呈现定义中,指的是表单字段类型。谢谢。我尝试删除模块,并更改模块以匹配我的自定义模块。两者都没有效果。我编辑了我的答案,看一看。您需要在模块列表中添加依赖项;)谢谢您的时间@MacSim。我仍然看到同样的错误。我需要FieldConfig::create()吗?也许还有别的事情发生受保护的静态$modules=[“字段”、“用户”、“文本”、“商业支付”、“我的模块”]; // ... FieldStorageConfig::create(['field_name'=>'field_common_abc'、'entity_type'=>'user'、'module'=>'text'、'type'=>'text'、'cardinality'=>1、'locked'=>FALSE、'indexes'=>FALSE、'settings'=>['max_length'=>14、'is ascii'=>FALSE、'case\u-sensitive'=>FALSE、])->save()`是的,您需要FieldStorageConfig
和FieldConfig
。我从module.install以编程方式创建了该字段,从后台和shell安装该模块时没有任何问题。测试结果应该是一样的。。。奇怪的也许您应该尝试在$this->user=$this->drupalCreateUser()之前创建字段代码>