作为某些测试的一部分,我希望暂时用一个可以返回一组可预测的测试值的消息替换消息的内容。做这种工作的标准Smalltalk-y方法是什么?是否有一些示例代码供我查看?
一些澄清:
这是我想写的一些伪代码:
replaceMessage: 'fibonacci'
onClass: 'funFunctions'
with: 'returnsPredictableNumbersWithoutCalculatingThem'.
self runTestSet1.
restoreMessage: 'fibonacci'
onClass: 'funFunctions'.
self runFollowUpSet1. "Depends on state set by Set1"
replaceMessage: 'fibonacci'
onClass: 'funFunctions'
with: 'returnsPredictableNumbersWithoutCalculatingThemPart2'.
self runFollowUpSet2. "Depends on state set by followupset1"
restoreMessage: 'fibonacci'
onClass: 'funFunctions'.
答案 0 :(得分:4)
执行此操作的方法是使用MethodWrappers或类似方法。有一种叫做“物体作为方法”的东西,在一些Smalltalk方言中得到了支持,如Pharo和Squeak(不确定其他人)。这个想法是你可以使用任何对象作为方法。所以,你可以这样做:
MyClass methodDict at:#foo put:MyClassAsMethod new。
在MyClassMethod中你必须实现#run:aSelector with:arguments in:aReceiver
所以,当你这样做时:MyClass new foo。然后VM会看到你所拥有的不是CompiledMethod而是另一个对象,然后它会向这样的对象发送消息#run:with:in:
如果我是你,我会从这里下载pharo:https://gforge.inria.fr/frs/download.php/27524/Pharo-1.1.1-OneClickCogVM.zip
并将调查MethodWrappers包及其所有类。
答案 1 :(得分:4)
要将一条消息替换为另一条消息,您可以:
a)在相应的方法中,更改负责给定消息发送的选择器。
b)使用代理,包装所有感兴趣的对象并截取给定的消息,以便使用与原始方法不同的评估路径。答案 2 :(得分:3)
也许 MethodWrappers - ECOOP论文Wrappers to the Rescue
答案 3 :(得分:2)
我的第一个想法是子类并仅覆盖您想要返回测试值的特定消息。但是,您可能希望阅读Ward维基上的subclass to test和subclass to test anti-pattern条目。
要使此临时,您需要将子测试对象替换为子类的实例,然后在完成后将其更改回测试中的原始类。