metaprogramming - 如何在 Smalltalk 中以编程方式替换消息正文?

标签 metaprogramming smalltalk

作为某些测试的一部分,我希望暂时将消息的内容替换为将返回一组可预测的测试值的内容。完成此类工作的标准 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'.
    

    最佳答案

    要将一条消息替换为另一条消息,您可以:

    a) 在相应的方法中,更改负责给定消息发送的选择器。

    b) 使用代理来包装所有感兴趣的对象并拦截给定的消息,以便使用与原始方法不同的评估路径。

    关于metaprogramming - 如何在 Smalltalk 中以编程方式替换消息正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762058/

    相关文章:

    c++ - 我可以使用 C/C++ 预处理器添加数字吗?

    smalltalk - 我应该使用什么版本的 pharo 等进行新的开发?

    smalltalk - 如何找出对 myObject 的引用?

    c++ - 预处理/预编译 - 用常量替换变量

    c# - 如何使用 "delegated"访问器创建属性?

    c++ - boost::hana 前向声明 header 的用例是什么?

    c++ - 使用 boost mpl 插入器迭代器的意外结果

    promise - Pharo 与 Smalltalk 的差异

    smalltalk - 如何在smalltalk中写入txt文件

    collections - 有没有一种 Smalltalk 方法来转置数组?