gpt4 book ai didi

f# - FsCheck如何生成元组

转载 作者:行者123 更新时间:2023-12-01 10:25:02 26 4
gpt4 key购买 nike

这是一个 json 生成:

let strGen = Arb.Default.String()
|> Arb.toGen
strGen
|> Gen.arrayOf
|> Gen.map (String.concat "\", \"")
|> Gen.map (fun strs -> "[\"" + strs + "\"]")

如何在我的测试主体中创建 jsonstring 来断言最终结果。

最佳答案

我最初的答案是使用 Gen.map2 组合两个生成器,一个用于字符串数组,一个用于 json 字符串。但是 Gen.map2专门设计让两个独立生成器组合在一起的,即一个生成器的结果不会影响另一个。 (例如,掷两个骰子:第一个骰子的结果与第二个骰子的结果无关)。您需要的是一个简单的 Gen.map,它采用字符串数组生成器并生成一个元组 (string array, json)。像这样:

let strGen = Arb.Default.String() |> Arb.toGen
let arrayGen = strGen |> Gen.arrayOf
arrayGen |> Gen.map (fun array ->
let json =
array
|> String.concat "\", \""
|> fun strs -> "[\"" + strs + "\"]")
array,json)

与我在下面结合了两个独立生成器的答案不同,这里只有一个生成器,其值用于生成两者数组和 json 值。所以这些值将是相关的而不是独立的,json 将始终匹配字符串数组。

原始的,不正确的,答案如下,保留以防两个答案之间的对比有用:

Easy. Just save the array generator, and re-use it later, using Gen.map2 to combine the array and the json. E.g.:

let strGen = Arb.Default.String()
|> Arb.toGen
let arrayGen = strGen |> Gen.arrayOf
let jsonGen =
arrayGen
|> Gen.map (String.concat "\", \"")
|> Gen.map (fun strs -> "[\"" + strs + "\"]")
Gen.map2 (fun array json -> array,json) arrayGen jsonGen

And now you have a generator that produces a 2-tuple. The first element of the tuple is the string array, and the second element is the json that was generated.

BTW, your JSON-creating code isn't quite correct yet, because if the generated string contains quotation marks, you'll need to quote them in some way or your generated JSON will be invalid. But I'll let you handle that, or ask a new question about that if you don't know how to handle that. The "single responsibility principle" applies to Stack Overflow questions, too: each question should ideally be about just one subject.

关于f# - FsCheck如何生成元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48059352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com