我应该如何在 CakePHP 3.0 中使用 PHPUnit 测试此行为?

How should I test this behavior using PHPUnit in CakePHP 3.0 ?

我在 BrandBehavior 中有这个方法,我想测试一下。

public function setCurrentBrandId(Entity $entity)
{
    if (!isset($entity->brand_id) or empty($entity->brand_id)) {
        $entity->brand_id = $this->session->read("Brand.id");
    }
}

我想测试一下这个方法是否真的设置了 BrandID。你能给我举个例子吗?我应该如何测试这个?到目前为止,我基本上没有涵盖任何内容。

public function setUp()
{
    parent::setUp();
    $this->Progress = new BrandsBehavior();
}  
public function testSetCurrentBrandId()
{

}

如果您需要任何其他信息,请告诉我,让您知道我是测试和测试的初学者。

首先,行为通常无法访问会话 ($this->session) - 我假设您将其注入某处。在这种情况下,您可以模拟会话对象并对其进行测试(您可以阅读有关模拟的内容 here)。

其次,\Cake\ORM\Behavior::__construct 的方法签名是 Table $table, array $config = [] - 这意味着您需要稍微更改 setUp 方法。 This应该给点意见吧

第三,测试是关于验证 function/method 是否按照您的预期执行(基于输入)。因此,对于实际测试,您可以给它两个实体(一个有 brand_id 字段,另一个没有)和 assertEquals 调用此方法后 brand_id 字段的新值

此外,还有一些提示:

  • !$entity->has('field_name')!isset($entity->brand_id) or empty($entity->brand_id)
  • 的快捷方式
  • 将会话对象注入行为不是一个好主意。虽然它有一个明显的用途,但我建议您将实际值注入到行为中,或者(如果您需要从会话中读取的函数)将其移动到一个组件中。
  • 与其将 "Brand.id" 硬编码为要读取的会话密钥,不如考虑将其作为配置密钥