如何深入模拟支持链接方法的类

时间:2014-02-03 16:07:34

标签: php unit-testing laravel mockery

我正在尝试对我有$this->library->client->changeLog->create()的控制器进行单元测试,我想知道是否需要模拟这些属性中的每一个,或者我是否能够以某种方式深度模拟$this->library所以我不要不得不让一长串对象被模拟,并且还要担心它们的构造函数参数。我现在正试图嘲笑一个连锁店而且非常丑陋并且工作得不好。

我也试过$this->library->shouldReceive('client->changeLog->create')->once()->andReturn(true);,但它导致“试图获取非对象的属性。

是否有一种简单的方法来测试输出一个属性很深的方法的输出?

1 个答案:

答案 0 :(得分:2)

理论上,每个已更改的方法调用的返回结果都将返回$ this,因此您需要创建一个模拟对象并在每个方法调用上返回它。这是在堆栈溢出时执行此操作的示例。

Mock objects which support chaining methods

这样的代码通常可以看作代码味道,你可以在这个堆栈溢出帖子上阅读更多关于这里的内容。

"Message Chains" vs "Middle Man"

当您正在测试控制器并且我在该控制器中猜测一个动作时,您可能会测试控制器动作的输出。这意味着代码将全部执行,您将测试控制器操作的结果。

然后,您可能会重构代码,以便您没有链接的方法调用,这将使模拟和测试更容易。