I'm using FsUnit 2.3.2 and I'm not happy with the failure messages. See the examples below:
[<Test>]
let ``test 1``() =
[1; 3]
|> should equal [1;2]
... gives me the not-so-helpful message:
Expected and actual are both Microsoft.FSharp.Collections.FSharpList`1[System.Int32]
at FsUnit.TopLevelOperators.should[a,a](FSharpFunc`2 f, a x, 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:line 9
A workaround that I found was to use arrays instead of lists:
[<Test>]
let ``test 2``() =
[|1; 4|]
|> should equal [|1;2|]
...produces
Expected and actual are both System.Int32[2]
Values differ at index [1]
Expected: 2
But was: 4
A second problem is if I have an ADT defined
type MyT =
A of int
| B of string
[<Test>]
let ``test 4``() =
A 10
|> should equal (B "abc")
...gives me the message:
Expected: Program+MyT+B
But was: Program+MyT+A
...which I can workaround by implementing ToString for MyT like this:
override this.ToString() = match this with
| A i -> sprintf "A(%d)" i
| B s -> sprintf "B(%s)" s
...which will lead to a good message:
Expected: B(abc)
But was: A(10)
...but I would like fsunit to just render MyT values the way (sprintf "%A") does.
Anyway, having to do these workarounds is NOT OK.
How can I obtain useful messages for F# lists without using arrays?
How to obtain useful messages for ADTs?
Is there a good fix for the above issues or should I just drop FsUnit?
Do you have a better recommendation for a unit testing library for F# that doesn't have these issues?