首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FsCheck惰性生成器

FsCheck惰性生成器
EN

Stack Overflow用户
提问于 2020-01-03 18:50:53
回答 1查看 63关注 0票数 1

在我的测试中,我遇到了生成数据的问题。

代码语言:javascript
复制
    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"
    )

实际测试的代码是:

代码语言:javascript
复制
 semver {
            if operationAPI.OperationId<> operationClient.OperationId then yield! IncreaseMajor
            if operationAPI.Summary <> operationClient.Summary then yield! IncreaseMajor
        }

当生成的数据是相同的OperationId、相同的摘要和不同的描述时,测试应该失败。但它没有,它让我创建了自己的生成器,或者至少尝试这样做:

我希望我的测试是这样写的:

代码语言:javascript
复制
testProperty "calculate Operation against different operations should increase major" <| fun  (operationId:ElementSet<string>)  (summary:ElementSet<string>)   -> 

因此,我相应地创建了一个类型:

代码语言:javascript
复制
type ElementSet<'a> =
    | Same of 'a
    | Different 

以及此类型的生成器:

代码语言:javascript
复制
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

然后,我尝试提取数据来构造我的对象:

代码语言:javascript
复制
let createOpenApiOperation operationId summary=
let pi  = OpenApiOperation(OperationId=operationId.Get, Summary=summary.Get)    
pi

Get方法还不存在,所以我打算通过向ElementSet<‘a>添加一个成员来实现它:

代码语言:javascript
复制
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 

这就是我被卡住的地方。当我提取数据时,我希望在这里获得一些随机性。我想知道这是不是正确的方法,或者我是否应该早点回答这个问题?

感谢您的投入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-03 19:13:53

我想我找到了,答案是从一开始就处理它:

代码语言:javascript
复制
let setGen<'a when 'a:equality>   =
    Gen.oneof [
            gen { 
                let! v = Arb.generate<'a>
                return Same(v)
            }
            gen { 
                let! x,y  =
                    Arb.generate<'a>
                    |> Gen.two
                    |> Gen.filter (fun (a,b)-> a <> b)

                return Different(x,y)
            }
    ]

然后使用两个getter来访问这些值:

代码语言:javascript
复制
type ElementSet<'a> when 'a:equality=
    | Same of 'a
    | Different of 'a*'a
    with member this.Fst =  match this with | Same s -> s | Different (a, b)->  a
         member this.Snd =  match this with | Same s -> s | Different (a, b)->  b

通过这种方式,我可以访问测试中的值:

代码语言:javascript
复制
 testProperty "calculate Operation against different operations should increase major" <| fun  (operationId:ElementSet<NonWhiteSpaceString>)  (summary:ElementSet<NonWhiteSpaceString>) (description:ElementSet<NonWhiteSpaceString>)   -> 
  let operationClient = createOpenApiOperation operationId.Fst summary.Fst description.Fst
  let operationAPI = createOpenApiOperation operationId.Snd summary.Snd description.Snd
  let actual = calculate operationAPI operationClient
  Expect.equal actual (Fact.Semver.IncreaseMajor) "return IncreaseMajor"

为了记录起见,我创建了如下存根:

代码语言:javascript
复制
let createOpenApiOperation (operationId:NonWhiteSpaceString) (summary:NonWhiteSpaceString) (description:NonWhiteSpaceString)=
let pi  = OpenApiOperation(OperationId=operationId.Get, Summary=summary.Get, Description=description.Get)    
pi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59577240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档