如何为FsUnit提供有用的断言失败消息?

vid*_*idi 5 f# nunit fsunit

我正在使用FsUnit 2.3.2,但对失败消息不满意。请参阅以下示例:

[<Test>]
let ``test 1``() =
    [1; 3]
    |> should equal [1;2]
Run Code Online (Sandbox Code Playgroud)

...给了我不太有用的信息:

预期的和实际的都是Microsoft.FSharp.Collections.FSharpList`1 [System.Int32]

在d:\ GitHub \ FsUnit \ src \ FsUnit.NUnit \ FsUnit.fs:第44行位于d:\ GitHub \ FsUnit \ src \ FsUnit.TopLevelOperators.F.Program.test 1()中F:\ work \操场\ fsunit \ fsunit \ Program.fs:第9行

我发现一种解决方法是使用数组而不是列表:

[<Test>]
let ``test 2``() =
    [|1; 4|]
    |> should equal [|1;2|]
Run Code Online (Sandbox Code Playgroud)

...产生

预期和实际都是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")
Run Code Online (Sandbox Code Playgroud)

...给我消息:

预期: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
Run Code Online (Sandbox Code Playgroud)

...这将带来一个好消息:

预期:B(abc),
但预期:A(10)

...但是我希望fsunit仅以(sprintf“%A”)的方式呈现MyT值。

无论如何,必须执行这些变通办法。

如何在不使用数组的情况下获取有关F#列表的有用消息?

如何获取有关ADT的有用消息?

以上问题是否有很好的解决方法,还是我应该只删除FsUnit?

对于没有这些问题的F#单元测试库,您是否有更好的建议?

Fun*_*unk 3

几个竞争者:

\n\n

埃奇托

\n\n
[<Tests>]\nlet tests =\n  testList "test group" [\n    testCase "strings" <| fun _ ->\n        let subject = "Hello World"\n        Expect.equal subject "Hello world"\n                    "The strings should be equal"\n\n    testCase "lists" <| fun _ ->\n        let expected = [1; 2]   \n        Expect.equal expected [1; 3]\n                    "The lists should be equal"\n\n    testCase "DUs" <| fun _ ->\n        let expected = A 10   \n        Expect.equal expected (B "abc")\n    ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出

\n\n
\n
[19:29:46 INF] EXPECTO? Running tests...\n[19:29:46 ERR] test group/strings failed in 00:00:00. \nThe strings should be equal.\n          Expected string to equal:\n          "Hello world"\n                 \xe2\x86\x91\n          The string differs at index 6.\n          "Hello World"\n                 \xe2\x86\x91\n          String does not match at position 6. Expected char: \'w\', but got \'W\'.\n\n[19:29:46 ERR] test group/lists failed in 00:00:00. \nThe lists should be equal. Actual value was [1; 2] but had expected it to be [1; 3].\n\n[19:29:46 ERR] test group/DUs failed in 00:00:00. \nThe DUs should be equal. Actual value was A 10 but had expected it to be B "abc".\n\n[19:29:46 INF] EXPECTO! 3 tests run in 00:00:00.0028417 \xe2\x80\x93 0 passed, 0 ignored, 3 failed, 0 errored. ( \xe0\xb2\xb0 \xc4\xb9\xcc\xaf \xe0\xb2\xb0\xe0\xb3\x83 )\nval it : int = 1\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

取消引用

\n\n
[<Test>]\nlet ``The strings should be equal`` () =\n    let subject = "Hello World"\n    subject =! "Hello world"\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
Result Message:   \n"Hello World" = "Hello world"\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
[<Test>]\nlet ``The lists should be equal`` () =\n    let expected = [1; 2]\n    expected =! [1; 3]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
Result Message:   \n[1; 2] = [1; 3]\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
[<Test>]\nlet ``The DUs should be equal`` () =\n    let expected = A 10\n    expected =! (B "abc")\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
Result Message:   \nA 10 = B "abc"\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

Unquote 的好处在于它Quotations允许逐步显示失败消息。

\n\n
[<Test>]\nlet ``The arrays should be equal`` () =\n    let expected = [|0 ; 2 ; 3 ; 4|]\n    test <@ (Array.map ((+) 1) [|0 .. 3|]) = expected @>\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
Result Message:   \nArray.map ((+) 1) [|0..3|] = [|0; 2; 3; 4|]\nArray.map ((+) 1) [|0; 1; 2; 3|] = [|0; 2; 3; 4|]\n[|1; 2; 3; 4|] = [|0; 2; 3; 4|]\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n
\n