Unit testing 如何在Drupal8的单元测试中设置自定义字段

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

我试图测试与用户实体上的自定义字段相关的方法的功能。 当我试图在单元测试的设置方法中设置这些字段的值时,我得到一个错误:Field*未知

我的初始测试如下所示:

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()之前创建字段