【问题标题】:Extbase: testing function with injected repositoryExtbase:使用注入存储库的测试功能
【发布时间】:2013-08-25 05:02:12
【问题描述】:

我使用 TYPO3 6.1。

我实际上尝试使用注入存储库的 phpunit 来测试一个方法。

$mock = $this->getMockedRepository(
    '\\MyExt\\Domain\\Repository\\MyRepository',
    array(
        'findByUid' => array('count' => 0, 'return' => array()),
    )
);
$this->tokenHelperObj->injectMyRepository($mock);

getMockedRepository 函数只是一个助手,它从 phpunit 调用 getMock 函数。在其他情况下,此功能有效。在我的助手类中,我只使用依赖注入,如

/**
 * myRepository
 *
 * @var \MyExt\Domain\Repository\MyRepository
 * @inject
 */
protected $myRepository;

当我调用测试时,我得到了

Call to undefined method Class::injectActivityRepository()

我不想为我使用的不同存储库编写所有注入方法。还有其他方法可以模拟注入的存储库吗?

【问题讨论】:

  • 什么是$this->tokenHelperObj 以及如何在扩展代码(而不是测试)中获取存储库?
  • $this->tokenHelperObj 是我的夹具类,它在设置时初始化,我想测试。我用@inject 注入我的存储库。

标签: phpunit typo3 extbase


【解决方案1】:

从 TYPO3 6.1 开始,类 \TYPO3\CMS\Core\Tests\UnitTestCase 已被扩展为使用名为 inject() 的新方法。此方法可用于注入依赖项,因此您不必创建注入方法。

用法:

$this->inject($target, $name, $dependency)

下面是一个示例测试:

/**
 * @test
 */
public function serviceReturnsFalseIfNoRecordsFoundTest() {
    $mockQuery = $this->getMock('TYPO3\CMS\Extbase\Persistence\QueryInterface');

    $mockRepository = $this->getMock('\TYPO3\MyExtension\Domain\Repository\TestRepository');
    $mockRepository->expects($this->once())->method('findAll')->will($this->returnValue($mockQuery));

    $this->inject($this->fixture, 'testRepository', $mockRepository);

    $this->assertTrue($this->fixture->doSomething());
}

【讨论】:

  • 嗨,方法 $this->inject($target, $name, $dependency) 在 \TYPO3\CMS\Extbase\Tests\Unit\BaseTestCase 中。不在“\TYPO3\CMS\Core\Tests\UnitTestCase”中!
  • $this->fixture 是您正在单元测试的类的主要实例。通常您在测试类的setup() 中创建它。参见github.com/derhansen/sf_event_mgt/blob/master/Tests/Unit/… 示例(注意,我的变量称为$subject 而不是$fixture
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多