首页 > 解决方案 > 如何防止基于模型的测试中的收缩?

问题描述

这是 FsCheck 中基于模型的测试的示例:

let spec =
  let inc = { new Command<Counter, int>() with
                    override __.RunActual counter = counter.Inc(); counter
                    override __.RunModel m = m + 1
                    override __.Post(counter, m) = counter.Get = m |@ sprintf "model: %i <> %A" m counter
                    override __.ToString() = "inc" }
                           
  let dec = { new Command<Counter, int>() with
                    override __.RunActual counter = counter.Dec(); counter
                    override __.RunModel m = m - 1
                    override __.Post(counter, m) = counter.Get = m |@ sprintf "model: %i <> %A" m counter
                    override __.ToString() = "dec" }
  
  { new ICommandGenerator<Counter,int> with
      member __.InitialActual = Counter()
      member __.InitialModel = 0
      member __.Next model = Gen.elements [inc;dec] }

如何禁用此测试的命令收缩?

标签: f#fscheck

解决方案


如果您想阻止 FsCheck 缩小使用的命令数量(请参阅我上面的问题),您可以将规范转换为禁用缩小的属性:

let property =
    let generator = Command.generate spec
    let shrinker _ = Seq.empty   // disable
    Command.toPropertyWith spec generator shrinker
Check.Quick(property)

这允许 FsCheck 生成比所需更长的命令序列。例如[inc; inc; dec; inc; inc; dec; dec; dec]


推荐阅读