首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Fuzz ( Fuzz ( Fuzz ))平坦,而不需要在fuzz测试模块中使用andThen?

如何使Fuzz ( Fuzz ( Fuzz ))平坦,而不需要在fuzz测试模块中使用andThen?
EN

Stack Overflow用户
提问于 2019-07-03 18:45:54
回答 1查看 108关注 0票数 3

我有一个“父”A类型,其中包含“一个子”B类型。

这是我在应用程序中主要数据结构的简化版本。

ABA_idB_id都是独立的elm模块。

如果我能使这个简化工作,那么也许更容易解决我的实际问题。

基本上,我的问题是如何为A创建一个模糊程序。

条件是A_idB_id ..。需要共享相同的A_id

代码语言:javascript
复制
type A
    = A { id : A_id
        , b : B -- A contains B.
        }

type A_id
    = A_id String

type B
    = B { id : B_id } -- B contains B_id

type B_id
    = B_id ( A_id, String ) -- B_id contains A_id. The exact same A_id as its parent A

a_idFuzzer : Fuzzer A_id
a_idFuzzer =
    Fuzz.string
        |> Fuzz.map A_id

aFuzzer : Fuzzer A
aFuzzer =
    a_idFuzzer
        |> Fuzz.map
            (\a_id ->
                bFuzzer a_id
                    |> Fuzz.map
                        (\b ->
                            -- here i just need the b,
                            -- but in reality i need more children
                            -- for assembling the A data structure.
                            -- i need a C and D with a cFuzzer and a dFuzzer...
                            -- and both C and D depend on having the same A_id value.
                            -- like B does.
                            A
                                { id = a_id
                                , b = b
                                }
                        )
            )



-- im passing A_id as an argument since is generated only once on the parent ( A )
-- and is shared with this B child.

bFuzzer : A_id -> Fuzzer B
bFuzzer a_id =
    Fuzz.string
        |> Fuzz.map (\s -> B_id ( a_id, s ))
        |> Fuzz.map (\id -> B { id = id })

那么如何创建这个Fuzzer A

对于上面的代码,我得到了Fuzzer (Fuzzer A)错误,而不是Fuzzer A

在我的实际应用程序中,我得到了一个更复杂的错误:

Fuzzer ( Fuzzer ( Fuzzer ( Fuzzer Exchange )))Fuzzer Exchange.

我基本上需要用andThen把它压平--但在fuzz测试包中不存在这样的功能--原因不太明显。

我尝试了什么:

我和这个问题斗争了3天--有人说andthen是故意移除的,我应该使用custom模糊处理器--我更深入地了解了收缩器的工作原理(我以前不知道它们),以及如何使用Fuzz.custom来测试它们是否正确。

Fuzz.custom需要一个生成器和一个收缩器。

我可以建造发电机并产生我所需要的一切,但我不能建造收缩器-因为B,A,C和D。所以都是不透明的数据结构--在它们自己的模块中--所以我需要用getter获取它们的所有属性,以便缩小它们。

因此,对于上面的例子-为了缩小B,我需要提取b_id并通过一个收缩器运行它。然后通过创建一个新的B --使用B的公共api --将其重新放入B中。对于我在BCD等上保留的所有属性,我没有公共getter api。这样做似乎是不对的(在应用程序中添加我不需要的getters -只是为了测试目的。))

所有这些乱七八糟的是因为毛绒模块上的andThen被移除..。但也许有办法,也许他们是对的-我看不出解决办法。链接到模糊模块:这里

那么,如何为A数据类型构建一个模糊程序呢?

对如何处理这个嵌套的有什么想法吗?如何将它们压平到一个水平?

或者说不同的话,如何构建像上面这样相互依赖的模糊?(我脑海中的一个例子是,运行一个http请求,它依赖于另一个http请求在启动之前完成),因为它需要来自上一个请求的数据。这个模型被认为是函数式编程,通常是用andThenbind之类的工具完成的。)

任何洞察力都是值得赞赏的。谢谢:)

EN

回答 1

Stack Overflow用户

发布于 2019-07-04 03:11:10

我可以建造发电机并产生我所需要的一切,但我不能建造收缩器

那就别费心了。把Shrink.noShrink传给Fuzz.custom。当您的测试失败时,唯一的缺点将出现,您将得到几个A类型的大值,而不是(理想情况下)一个小值。

当您使用复杂类型时,您将更清楚地了解如何将其导致测试失败的值收缩为“较小”的值,这些值仍然会导致测试失败。在这个问题上,您将更好地生成“有趣”的值来查找测试失败。

在Elm测试的下一个主要版本(时间表未设定)中,Shrinkers将有相当大的改进,包括更好的文档,删除懒散的列表以支持常规的Elm列表,并将其重命名为“regular”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56876283

复制
相关文章

相似问题

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