我的理解是,编写代码时应该不考虑测试,并且测试需要弯曲以迎合代码。我的问题是我有一个函数f1调用data从另一个函数返回的输入数据(Haskell 类型)f2。那么如何编写提供不同输入数据的测试用例呢?
当然,我可以f1为输入添加一个参数,但毕竟这是为了测试。它实际上比这更混乱,因为f1实际上是Plutus 合约,并且 arg 需要序列化为 JSON —— 所有这些都是为了测试。或者,我可以从文件中读取输入,并提供文件路径作为参数——参数已经够糟糕了,但如果不需要的话,我不想使用文件。
请注意,这f1是一个 http 端点,所有测试代码都需要通过端点。
data ActualData = ActualData String String Integer
newtype Input = Input [ActualData]
f1:: Contract () Schema Text ()
f1 = do
let input = f2
...
f2 :: Input -- to be determined in the future, currently unknown
f2 = Input
[ ActualData "BlackRock" "pkh1" 10
, ActualData "GreenRock" "pkh2" 20
]
Run Code Online (Sandbox Code Playgroud)
我认为最简单的可能就是公开两个函数。一个接受输入数据作为普通的旧函数输入,另一个知道使用f2. 所以:
f1WithArg :: X -> Y
f1WithArg x = {- ... -}
f1 :: Y
f1 = f2 >>= f1WithArg -- or whatever
Run Code Online (Sandbox Code Playgroud)
然后,您将根据 编写所有测试f1WithArg,并相信它f1不会进行任何有趣的计算。
或者,您可以公开一个f1采用Maybe X, 并具有类似实现模式的单个:
f1Auto :: Maybe X -> Y
f1Auto Nothing = f2 >>= f1Auto . Just -- or whatever
f1Auto (Just x) = {- ... -}
Run Code Online (Sandbox Code Playgroud)
如果您需要以编程方式决定输入是否应来自,类似的某些接口可能会很有用f2,但听起来似乎不适合您。