【发布时间】:2020-01-03 19:13:53
【问题描述】:
我在测试中生成数据时遇到问题。
testProperty "calculate Operation against different operations should increase major" <| fun operationIdApi operationIdClient summaryApi summaryClient descriptionApi descriptionClient ->
( notAllEqual [
fun () -> assessEquality <| StringEquals(operationIdApi, operationIdClient)
fun () -> assessEquality <| StringEquals(summaryApi , summaryClient)
fun () -> assessEquality <| StringEquals(descriptionApi, descriptionClient)
]) ==> lazy (
let operationClient = createOpenApiOperation operationIdClient summaryClient descriptionClient
let operationAPI = createOpenApiOperation operationIdApi summaryApi descriptionApi
let actual = calculate operationAPI operationClient
Expect.equal actual (Fact.Semver.IncreaseMajor) "return IncreaseMajor"
)
实际测试的代码是:
semver {
if operationAPI.OperationId<> operationClient.OperationId then yield! IncreaseMajor
if operationAPI.Summary <> operationClient.Summary then yield! IncreaseMajor
}
当产生的数据是相同的OperationId,相同的摘要和不同的描述时,测试应该失败。 但事实并非如此,它让我创建了自己的生成器,或者至少尝试这样做:
我希望我的测试写成这样:
testProperty "calculate Operation against different operations should increase major" <| fun (operationId:ElementSet<string>) (summary:ElementSet<string>) ->
因此我相应地创建了一个类型:
type ElementSet<'a> =
| Same of 'a
| Different
以及这种类型的生成器:
let setGen<'a> =
Gen.oneof [
gen {
let! v = Arb.generate<'a>
return Same(v)
}
gen { return Different}
]
type ElementSetGenerator =
static member ElementSet() =
Arb.fromGen setGen<'a>
do Arb.register<ElementSetGenerator>() |> ignore
然后我试图提取数据来构造我的对象:
let createOpenApiOperation operationId summary=
let pi = OpenApiOperation(OperationId=operationId.Get, Summary=summary.Get)
pi
Get 方法还不存在,所以我打算通过向我的 ElementSet 添加一个成员来实现它:
type ElementSet<'a> =
| Same of 'a
| Different
with member this.Get =
match this with
| Same s -> s
| Different -> Arb.generate<'a>// some random generation here
这就是我卡住的地方。当我提取数据时,我很想在这里获得一些随机性。我想知道这是否是正确的方法,还是我应该早点回答这个问题?
感谢您的意见。
【问题讨论】: