我正在尝试对我有$this->library->client->changeLog->create()
的控制器进行单元测试,我想知道是否需要模拟这些属性中的每一个,或者我是否能够以某种方式深度模拟$this->library
所以我不要不得不让一长串对象被模拟,并且还要担心它们的构造函数参数。我现在正试图嘲笑一个连锁店而且非常丑陋并且工作得不好。
我也试过$this->library->shouldReceive('client->changeLog->create')->once()->andReturn(true);
,但它导致“试图获取非对象的属性。
是否有一种简单的方法来测试输出一个属性很深的方法的输出?
答案 0 :(得分:2)
理论上,每个已更改的方法调用的返回结果都将返回$ this,因此您需要创建一个模拟对象并在每个方法调用上返回它。这是在堆栈溢出时执行此操作的示例。
Mock objects which support chaining methods
这样的代码通常可以看作代码味道,你可以在这个堆栈溢出帖子上阅读更多关于这里的内容。
"Message Chains" vs "Middle Man"
当您正在测试控制器并且我在该控制器中猜测一个动作时,您可能会测试控制器动作的输出。这意味着代码将全部执行,您将测试控制器操作的结果。
然后,您可能会重构代码,以便您没有链接的方法调用,这将使模拟和测试更容易。