【问题标题】:How should I test this behavior using PHPUnit in CakePHP 3.0 ?我应该如何在 CakePHP 3.0 中使用 PHPUnit 测试这种行为?
【发布时间】:2017-04-09 03:05:06
【问题描述】:

我在 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()
{

}

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

【问题讨论】:

    标签: php cakephp phpunit integration-testing


    【解决方案1】:

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

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

    第三,测试是关于验证函数/方法是否符合您的预期(基于输入)。所以对于实际测试你可以给它两个实体(一个有brand_id字段,另一个没有)和assertEquals调用这个方法后brand_id字段的新值

    另外,还有一些提示:

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

    【讨论】:

    • 感谢 Xymanek 的回复。然后我还有一些问题。我实际上是将 $this->session 注入到初始化方法中,并且试图在测试方法中模拟它。我没有在测试方法中得到这些行 - // 为 SomeClass 类创建一个存根。 $stub = $this->createMock(SomeClass::class);我知道 SomeClass 是什么,它应该是 Session,但我不知道什么是 class ?感谢您的提示。我正在使用这三个。
    • SomeClass::class 以字符串形式返回类名(带有命名空间)
    • 我的测试班的第一个方法是这样的。公共函数 testSetCurrentBrandId() { $stub = $this->createMock(Session::class); $stub->method('setCurrentBrandId') ->willReturn(1); $this->assertEquals(1, $stub->setCurrentBrandId());这就是它返回的内容:尝试配置无法配置的方法“setCurrentBrandId”,因为它不存在、尚未指定、是最终的还是静态的 这是否意味着我无权访问我的类正在尝试测试??
    • @Speedy 你有点困惑——你试图模拟不属于会话对象的setCurrentBrandId(),它属于行为。另外,如果您不熟悉测试、PhpUnit 等。我强烈建议您阅读 Google 的一些文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2017-08-14
    • 1970-01-01
    • 2012-08-17
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多