测试反应式异步代码的策略

我正在开发面向数据流的领域特定语言。 为了简化,让我们看看操作。 操作有许多命名参数,可以使用它们的当前状态要求计算其结果。

为了决定一个操作何时应该产生一个结果,它得到一个决定,该决定对哪个参数从谁得到一个值是敏感的。 当本决定决定完成时,它使用观察者发出一个信号。

访问者监听此信号,然后调用操作的结果方法,以便将其复用到其他操作的参数。

到目前为止,如此好的,很好地解耦设计,可组合和可重用的,并且根据所使用的特定观察者而异,如你所希望的那样。

现在,这是我的问题:我很想开始编写针对这种设计的实际测试代码。 但是用一个异步的Observer ...

  • 我应该怎么知道整个信号和参数管道工作?
  • 为了说它已成功发射,我是否需要在等待信号时使用超时?
  • 我怎么能,正式地,确定信号不会被发射,如果我再等一会儿(停止问题?-))
  • 而且,我怎么能确定信号是由于我设置了一个参数而不是另一个操作? 很可能是因为我的测试来得很早,并且在设置参数之前看到一个发出的信号,导致决定发出它。
  • 目前,我猜这些微不足道的情况很容易测试,但只要我想测试复杂的多对多情况,我必须诉诸于希望设计Just Works(tm)......

    编辑(1):

    我们考虑以下情况:

    想象一下,操作A为操作B1,B2和B3提供了一个值,每个操作都有一个On-Every-Input-Decision(每当更新任何参数时都满足)。 然后,B1和B2以及B3各自将它们的值提供给操作C的相同参数(以便将这些值聚合到查找表中或某些类型中)。

    预期的步骤是:

  • 一个信号表明它具有新的价值(凭借其决定)
  • 一段时间后,异步观察器将信号发送到任何已注册的信号
  • 啊,Accessor注册了。 它的回调被调用,该回调取回操作的结果并将其复用到B1,B2和B3的参数
  • B1,B2和B3通知他们的决定,这为观察者创建了三个新的信号
  • 一段时间后,异步观察器分派B1的信号,然后是B2,然后是B3
  • 每个信号都会导致Accessor读取B1(2,3)的结果并将其输入到C中
  • 所以,我知道在这种情况下,我可以嘲笑例如C的决定,看它是否确实知道B1,B2和B3做了什么。 问题是:我什么时候可以安全地检查?

    编辑(2):我的目标似乎更像是端到端测试,即把DSL的各个部分放在一起,看看结果是否按我期望的方式运行。

    编辑(3):原来我太过于复杂:-)


    你需要确保你的所有不同的组件都被连接出来,然后一次测试一个特定的类,嘲笑所有其他的东西。

    注意:这个解释假定你正在使用依赖倒置的原理以及一个嘲讽库(比如Rhino Mocks)。

    你说:

    为了决定一个操作何时应该产生一个结果,它得到一个决定,该决定对哪个参数从谁得到一个值是敏感的。 当本决定决定完成时,它使用观察者发出一个信号。

    访问者监听此信号,然后调用操作的结果方法,以便将其复用到其他操作的参数。

    这对我说,你会构建一个嘲笑IDecision的行动。 您的单元测试可以协调IDecision的行为,以便执行操作可能需要处理的所有可能的场景。

    同样,您的Accessor测试也有一个模拟IDecision,它被设置为以现实的方式运行,以便您可以完全独立地测试Accessor类。 它也可以有一个模拟IOperation,你可以测试你的Accessor在模拟对象上调用合适的方法来响应所需的激励。

    简介:单独测试每个类,使用所有其他部分的模拟对象来编排适当的行为。


    我没有使用过这个,但是我听说Reactive Framework可以用于将事件转化为Linq语句 - 然后可以用它来实现简单的单元测试。

    这是我相信他们如何测试大量的Silverlight代码 - 实际上,Reactive框架是通过Silverlight Toolkit(System.Reactive.dll)分发的。

    链接地址: http://www.djcxy.com/p/1441.html

    上一篇: Strategies for testing reactive, asynchronous code

    下一篇: How to get Hudson to show complete selenium report?