2017-03-17 78 views
0

我有以下问题:
我想测试控制器,如果在调度过程中没有发生异常,但控制器使用外部库,它有自己的phpunit测试。这个库也使用外部库与自己的测试等等...模拟PHPUnit中的所有有效方法

所以我的应用程序看起来类似于本图:

request -> router -> dispatch -> controller -> view

如果在此procces任何错误occures。应用程序抛出异常。我想测试控制器,但现在我必须编写+50行代码来模拟所需的所有对象。

图像例如,我从控制器传递到view
view我有这样的事情:

<?php echo $form->openTag('form'); ?> 
    <?php echo $form->openTag('fieldset'); ?> 
     <?php echo $form->label('firstName'); ?> 
     <?php echo $form->input('firstName'); ?> 
     <?php echo $form->errorMessages('firstName'); ?> 
    <?php echo $form->closeTag('fieldset'); ?> 
    <?php echo $form->openTag('fieldset'); ?> 
     <?php echo $form->label('gender'); ?> 
     <?php echo $form->radio('gender'); ?> 
     <?php echo $form->errorMessages('gender'); ?> 
    <?php echo $form->closeTag('gender'); ?> 
    ... 
<?php echo $form->closeTag('form'); ?> 

比方说,我有形式与20个输入......你明白我的意思?我必须模拟所有可用的方法来通过我的测试。

可以用所有有效的方法来模拟对象吗?

我的意思是如果有一种方法来模拟类将有所有方法有效?不需要定义任何东西。
如果应用程序需要类A的对象,它将返回类A的对象。
如果应用程序需要阵列将返回阵列
等。

+0

不,这不是嘲笑的作品 - 你的嘲笑不能假设你在运行时给你什么,而是你必须指示你的嘲笑,并让它们返回你想要测试的东西那个时间点。 第三方依赖有其自己的单元测试的事实应该给你足够的覆盖,尽管...你应该嘲笑这些依赖并且有一系列单元测试,确保你的控制器处理任何依赖可能适当返回的东西。 –

+0

所以,你说我必须编写+50行代码才能模拟该窗体的工作正常吗? – user7686493

回答

0

,我们所知甚少你的应用环境中,但默认情况下$this->createMock(Some::class)会造成整个类的模拟 - 无需嘲笑每一个方法。然后你可以只对某些方法定义行为,这就是整个嘲讽的重点。所以在你的情况下,我想你会看到你的表单类,你必须将它设置为视图。

但我会问你在测试什么?如果您正在测试表单是否会抛出异常,那么您不希望嘲笑它,而是执行它并检查异常。

+0

'......你只能对某些方法定义行为......,如果我需要定义20或25个方法来使其工作,该怎么办?我测试我的请求是否正确调度,但如果元素在视图中抛出错误,我无法测试它 – user7686493

+0

然后,您的代码需要重新接近,因为它的写入方式无法测试@ user7686493 –

+0

@ user7686493您为什么要模拟然后表单 - 您希望它被执行而不被模拟并检查异常。 – ddinchev

相关问题