使用MockBox模拟瞬态对象

时间:2013-06-24 21:17:36

标签: unit-testing inversion-of-control coldbox

我在模型的顶部有这个注入元数据:

<cfproperty name="injector" inject="wirebox" />

以后,在函数中我请求依赖并开始使用它:

variables.injector.getInstance("MyTransientDependency").doSomeStuff()

在编写我的单元测试时,我想模拟MyTransientDependency对象,但我不确定如何去做,而它是由wirebox提供的。

为了给出一个更真实的例子,让我们说wirebox在同一个函数中多次调用了getInstance(),每次都传递不同的名字。因此,模拟getInstance函数的返回将是一个痛苦,并且(如果使用$ results()之类的东西)维护噩梦如果内部请求的依赖关系的顺序发生了更改,而不会以某种方式更改函数的行为需要更新单元测试。无论如何,这种方法感觉很蠢。

我猜测有一种简单的方法可以劫持variables.injector引用并为我的组件提供一个wirebox实例(或类似的东西),它将返回我在单元测试中指定的模拟而不是映射到我的单元中的实际对象应用程序的活页夹(Wirebox.cfc)...并根据我正在测试的代码中传入getInstance()函数的名称来完成。

如果在一个函数中你想要测试,你会得到同一个命名对象的多个实例,你需要模拟相同的函数来返回不同的结果(比如你测试的函数需要2') person'对象并初始化一个是A类的人,另一个是B类的人,而person组件应该从你需要模拟的特定函数返回不同结构的数据。在这种情况下你可能不会能够摆脱使用$ results()之类的东西,也许就是它的用途。

但我的主要问题是模拟瞬态的“正确方法”是什么?

1 个答案:

答案 0 :(得分:1)

荡。在文档中再搜索一下,我找到了它。

http://wiki.coldbox.org/wiki/MockBox.cfm#.24args()概述了使用$ args()来模拟函数和特定参数(或args集)组合的结果。

有关使用示例,请参阅此示例代码中的getWireBox函数: https://groups.google.com/forum/#!msg/coldbox/FoXPjEf798g/rVKhN-8VY34J

我们模拟wirebox,然后在传入不同的值时使用$ args()来模拟getInstance函数。