我使用的是FsUnit 2.3.2,我对失败消息不满意。见下面的例子:
[<Test>]
let ``test 1``() =
[1; 3]
|> should equal [1;2]..。给我一个毫无帮助的信息:
预期和实际都是Microsoft.FSharp.Collections.FSharpList
1[System.Int32] at FsUnit.TopLevelOperators.should[a,a](FSharpFunc2 f,a x,d:\GitHub\FsUnit\src\FsUnit.NUnit\FsUnit.fs:line 44中的F:\work\playground\fsunit\fsunit\Program.fs:line 9中的Program.test 1()
我发现的一个解决办法是使用数组而不是列表:
[<Test>]
let ``test 2``() =
[|1; 4|]
|> should equal [|1;2|]...produces
预期和实际都是System.Int322 值在索引1处不同 预期:2 但当时:4
第二个问题是,如果我定义了一个ADT
type MyT =
A of int
| B of string
[<Test>]
let ``test 4``() =
A 10
|> should equal (B "abc")...gives我的信息:
预期: Program+MyT+B 但曾是: Program+MyT+A
...which我可以通过为MyT实现这样的ToString来解决这个问题:
override this.ToString() = match this with
| A i -> sprintf "A(%d)" i
| B s -> sprintf "B(%s)" s...which将带来一个很好的信息:
预期: B(abc) 但曾经是: A(10)
...but我希望fsunit只像MyT值那样呈现MyT值(sprintf "%A")。
无论如何,必须做这些解决办法是不可以的。
如何在不使用数组的情况下为F#列表获取有用的消息?
如何为ADT获取有用的消息?
对于上述问题是否有一个很好的解决方法,还是我应该直接放弃FsUnit?
对于没有这些问题的F#单元测试库,您有更好的建议吗?
发布于 2017-04-13 18:18:56
有几个竞争者:
[<Tests>]
let tests =
testList "test group" [
testCase "strings" <| fun _ ->
let subject = "Hello World"
Expect.equal subject "Hello world"
"The strings should be equal"
testCase "lists" <| fun _ ->
let expected = [1; 2]
Expect.equal expected [1; 3]
"The lists should be equal"
testCase "DUs" <| fun _ ->
let expected = A 10
Expect.equal expected (B "abc")
]输出
19:29:46预期中程?进行测试..。19:29:46错误测试组/字符串在00:00:00失败。字符串应该是相等的。预期字符串为相等:"Hello“↑字符串在索引6处不同。"Hello“↑字符串在位置6不匹配。预期字符:'w',但得到'W‘。19:29:46错误测试组/列表在00:00:00失败。名单应该是相等的。实际值为1;2,但预期为1;3.19:29:46错误试验组/DUs在00:00:00失败。数字应该是相等的。实际价值为A10,但预期为B "abc“。19:29:46 INF预期!3个测试在00:00运行:00.0028417-0通过,0被忽略,3失败,0错误。(ರĹ̯ರೃ) val it : int =1
[<Test>]
let ``The strings should be equal`` () =
let subject = "Hello World"
subject =! "Hello world"结果消息:"Hello“= "Hello”false
[<Test>]
let ``The lists should be equal`` () =
let expected = [1; 2]
expected =! [1; 3]结果消息: 1;2= 1;3 false
[<Test>]
let ``The DUs should be equal`` () =
let expected = A 10
expected =! (B "abc")结果消息:A 10 =B "abc“假
取消报价的好处在于它的Quotations,允许一步一步的失败消息.
[<Test>]
let ``The arrays should be equal`` () =
let expected = [|0 ; 2 ; 3 ; 4|]
test <@ (Array.map ((+) 1) [|0 .. 3|]) = expected @>结果消息: Array.map ((+) 1) x.0.3\x{e76f}\\{e76f}\x{e76f}\
https://stackoverflow.com/questions/43393711
复制相似问题