2

我正在尝试对我拥有的控制器进行单元测试,$this->library->client->changeLog->create()我想知道是否需要模拟这些属性中的每一个,或者我是否可以以某种方式进行深度模拟$this->library,这样我就不必模拟一长串对象并且还必须担心它们的构造函数参数。我现在正在尝试模拟一条链条,它非常丑陋,而且效果不佳。

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

有没有一种简单的方法来测试具有一些属性的方法的输出?

4

1 回答 1

2

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

支持链接方法的模拟对象

像这样的代码通常可以被视为一种代码异味,您可以在此堆栈溢出帖子中阅读更多信息。

“消息链”与“中间人”

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

然后,您可以潜在地重构代码,以便您没有链接方法调用,这将使模拟和测试变得更容易。

于 2014-02-03T16:40:43.527 回答