具有多个参数的类型3 PHPUNIT测试

具有多个参数的类型3 PHPUNIT测试,phpunit,typo3,typo3-6.2.x,Phpunit,Typo3,Typo3 6.2.x,我开始为我的扩展编写一些单元测试,现在我遇到了一个问题,我遇到了这个错误: Call to a member function hasArgument() on a non-object in C:\xampp\htdocs\typo3\typo3conf\ext\rere\Classes\Controller\FachController.php on line 121 FachController中的第121行是: if ($this->request->hasArgument

我开始为我的扩展编写一些单元测试,现在我遇到了一个问题,我遇到了这个错误:

Call to a member function hasArgument() on a non-object in C:\xampp\htdocs\typo3\typo3conf\ext\rere\Classes\Controller\FachController.php on line 121
FachController中的第121行是:

if ($this->request->hasArgument('modul')) {
我认为问题在于我没有将参数发送给控制器

所以我试了一下:

    $fach = new \ReRe\Rere\Domain\Model\Fach();

    $view = $this->getMock('TYPO3\\CMS\\Extbase\\Mvc\\View\\ViewInterface');
    $view->expects($this->once())->method('assign')->with(array('newFach' => $fach, 'modul' => 1));
    $this->inject($this->subject, 'view', $view);

    $this->subject->newAction($fach);
但那没有任何效果。。。为什么?

更新:

现在不行。。。尝试添加更多模拟。。。对于其他元素,如findByUid。。。但是这个模拟应该是什么样子呢

 $modul = new \ReRe\Rere\Domain\Model\Modul();

    $mockRequest = $this->getMock('TYPO3\\CMS\\Extbase\\Mvc\\Request');
    $mockRequest->expects($this->once())->method('hasArgument')->with('modul');

    $this->inject($this->subject, 'request', $mockRequest);

    $mockRequest->expects($this->once())->method('findByUid')->with(1);
    $this->inject($this->subject, 'request', $mockRequest);

    $view = $this->getMock('TYPO3\\CMS\\Extbase\\Mvc\\View\\ViewInterface');
    $this->inject($this->subject, 'view', $view);
    //$view->expects($this->once())->method('assign')->with('modul', $modul);

    $this->subject->showAction();
更新3

getUid()导致新操作代码出错


您的测试失败,因为
$this->request
对于
newAction
的单元测试是未知的。您需要为请求创建一个mockObject,并将其插入
newAction
的测试中,如下所示:

$mockRequest = $this->getMock('TYPO3\\CMS\\Extbase\\Mvc\\Request');
$mockRequest->expects($this->once())->method('hasArgument')->with('modul');
$this->inject($this->subject, 'request', $mockRequest);

谢谢,我怎么能提出不止一个论点呢?我需要发送fach对象,modulI不太明白为什么mockRequest需要一个“findByUid”。看来你把事情搞混了。FindByUid是一个来自存储库的方法,您还必须将它注入到操作的单元测试中。动作的完整代码(showAction或newAction)会很有帮助。是的,我当然知道taht findByUid来自repo,但我不知道如何对它进行模拟…我已经在我的扩展中添加了上面的新动作,我对所有控制器动作都有完整的代码覆盖。您可以将此作为如何在控制器单元测试中模拟不同组件的示例
$mockRequest = $this->getMock('TYPO3\\CMS\\Extbase\\Mvc\\Request');
$mockRequest->expects($this->once())->method('hasArgument')->with('modul');
$this->inject($this->subject, 'request', $mockRequest);