我正在使用 FsUnit 2.3.2,但我对失败消息不满意。请参阅以下示例:
[<Test>]
let ``test 1``() =
[1; 3]
|> should equal [1;2]
...给了我不太有用的信息:
预期和实际都是 Microsoft.FSharp.Collections.FSharpList`1[System.Int32]
在 FsUnit.TopLevelOperators.should[a,a](FSharpFunc`2 f, ax, Object y) in d:\GitHub\FsUnit\src\FsUnit.NUnit\FsUnit.fs:line 44 at Program.test 1() in F:\work\playground\fsunit\fsunit\Program.fs:第 9 行
我发现的一种解决方法是使用数组而不是列表:
[<Test>]
let ``test 2``() =
[|1; 4|]
|> should equal [|1;2|]
...产生
预期和实际都是 System.Int32[2]
索引 [1] 处的值不同
预期:2
但原为:4
第二个问题是我是否定义了 ADT
type MyT =
A of int
| B of string
[<Test>]
let ``test 4``() =
A 10
|> should equal (B "abc")
...给我的信息:
预期:Program+MyT+B
但原为:Program+MyT+A
...我可以通过为 MyT 实现 ToString 来解决这个问题:
override this.ToString() = match this with
| A i -> sprintf "A(%d)" i
| B s -> sprintf "B(%s)" s
...这将带来一个好消息:
预期:B(abc)
但是是:A(10)
...但我希望 fsunit 以 (sprintf "%A") 的方式呈现 MyT 值。
无论如何,不得不做这些变通办法是不行的。
如何在不使用数组的情况下获取 F# 列表的有用消息?
如何获取对 ADT 有用的消息?
上述问题是否有很好的解决方案,还是我应该放弃 FsUnit?
对于没有这些问题的 F# 单元测试库,您有更好的建议吗?