我在模型顶部有这个注入元数据:
<cfproperty name="injector" inject="wirebox" />
后来,在一个函数中,我请求一个依赖项并开始使用它:
variables.injector.getInstance("MyTransientDependency").doSomeStuff()
在编写我的单元测试时,我想模拟 MyTransientDependency 对象,但我不确定如何去做,而它是由 wirebox 提供的。
举一个更真实的例子,假设wirebox在同一个函数中多次调用getInstance(),每次传入不同的名称。因此,模拟 getInstance 函数的返回将是一件痛苦的事情,并且(如果使用类似 $results() 的东西)如果在内部请求依赖项的顺序发生变化而不以某种方式改变函数的行为,那么这将是一个维护噩梦需要更新单元测试。无论如何,这种方法感觉很恶心。
我猜有一种简单的方法可以劫持 variables.injector 引用并为我的组件提供一个线盒实例(或类似的东西),它将返回我在单元测试中指定的模拟,而不是在我的应用程序的活页夹中映射的实际对象( Wirebox.cfc)... 并根据我正在测试的代码中传递给 getInstance() 函数的名称执行此操作。
有点棘手的地方是,如果在您要测试的单个函数中获得同一个命名对象的多个实例,您需要在这些实例上模拟同一个函数以返回不同的结果(例如您测试的函数需要 2 个“人”对象并将一个初始化为 A 类型的人员,另一个初始化为 B 类型的人员,并且人员组件应从您需要模拟的特定函数返回不同结构的数据。在这种情况下,您可能无法不要使用像 $results() 这样的东西,也许这就是它的用途。
但我的主要问题是模拟瞬变的“正确方法”是什么?