首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为FsUnit提供有用的断言-失败消息?

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

Stack Overflow用户
提问于 2017-04-13 13:32:06
回答 1查看 641关注 0票数 6

我使用的是FsUnit 2.3.2,我对失败消息不满意。见下面的例子:

代码语言:javascript
复制
[<Test>]
let ``test 1``() =
    [1; 3]
    |> should equal [1;2]

..。给我一个毫无帮助的信息:

预期和实际都是Microsoft.FSharp.Collections.FSharpList1[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()

我发现的一个解决办法是使用数组而不是列表:

代码语言:javascript
复制
[<Test>]
let ``test 2``() =
    [|1; 4|]
    |> should equal [|1;2|]

...produces

预期和实际都是System.Int322 值在索引1处不同 预期:2 但当时:4

第二个问题是,如果我定义了一个ADT

代码语言:javascript
复制
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来解决这个问题:

代码语言:javascript
复制
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#单元测试库,您有更好的建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 18:18:56

有几个竞争者:

期待

代码语言:javascript
复制
[<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

取消报价

代码语言:javascript
复制
[<Test>]
let ``The strings should be equal`` () =
    let subject = "Hello World"
    subject =! "Hello world"

结果消息:"Hello“= "Hello”false

代码语言:javascript
复制
[<Test>]
let ``The lists should be equal`` () =
    let expected = [1; 2]
    expected =! [1; 3]

结果消息: 1;2= 1;3 false

代码语言:javascript
复制
[<Test>]
let ``The DUs should be equal`` () =
    let expected = A 10
    expected =! (B "abc")

结果消息:A 10 =B "abc“假

取消报价的好处在于它的Quotations,允许一步一步的失败消息.

代码语言:javascript
复制
[<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}\

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43393711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档