在Corda单元测试中,是否有一种方法可以在将流程提交到分类帐之前检查流程的结果?

时间:2019-08-06 21:24:15

标签: corda

我有一个流程,该流程查询一个oracle以获取带符号的随机数据(代表骰子掷骰),然后该随机数据成为结果交易的输出。具体来说,将发布新的DiceRollState。

在单元测试中,我需要确保给定的DiceRollState具有一定的值(反映骰子上的点数)以测试结果逻辑。例如-当DiceRollState的值为5时,我需要执行任务X;当DiceRollState的值为6时,我需要执行另一个操作。

下面是我用来在单元测试中运行流程的代码片段。

    val rollDiceFlow = RollDiceFlow(gameBoardState.linearId)
    val futureWithDiceRollPlayer1 = nodeA.startFlow(rollDiceFlow)

    // Can I do anything here to check the value 
    // of the outputted DiceRollState and revert / Rerun as required?

    network.runNetwork() 
    futureWithDiceRollPlayer1.getOrThrow()

如果不希望模拟流的结果,是否有任何方法可以还原?我可以执行以下任何操作吗?

  • 在运行流之前获取模拟网络的深层副本吗?

  • 在检查了可完成未来的内容后,如何以某种方式还原其影响?

  • 使用更好的模式来模拟来自oracle的响应吗?

1 个答案:

答案 0 :(得分:1)

(不幸的是)这里的答案是,这不是Corda的可测试设计模式。将模拟网络恢复为以前的状态可能是当前测试的一项有用功能,但目前尚不可用。

解决方案是:

  • 重构流程以接受掷骰子的可选参数。这样就可以构造并传递确定性骰子。
  • 创建一个返回确定性数据的模拟oracle,这将再次启用确定性骰子掷骰子

我选择重构rollDiceFlow以接受构建的骰子骰。 oracle在实际CorDapp的包装流中检索构造的骰子卷,但可以直接提供以进行测试。