F# 构造函数中的fsunit.xunit测试异常

F# 构造函数中的fsunit.xunit测试异常,f#,xunit,fsunit,guard-clause,F#,Xunit,Fsunit,Guard Clause,拥有 我正在尝试使用FsUnit+xUnit测试此异常: type Category(name : string, categoryType : CategoryType) = do if (name.Length = 0) then invalidArg "name" "name is empty" [] let``名称不应为空``()= (fun()->Category(String.Empty,CategoryTy

拥有

我正在尝试使用FsUnit+xUnit测试此异常:

type Category(name : string, categoryType : CategoryType) = 
        do
            if (name.Length = 0) then
                invalidArg "name" "name is empty"
[]
let``名称不应为空``()=
(fun()->Category(String.Empty,CategoryType.Terminal))|>应该抛出typeof。
我做错了什么


  • 虽然我不是FsUnit专家,但我认为应该使用
    MatchException
    类型,因为FsUnit使用自定义匹配器,匹配不会成功

    然而,书面测试似乎不正确,因为

    [<Fact>]
    let ``name should not be empty``() =
        (fun () -> Category(String.Empty, CategoryType.Terminal)) |> should throw typeof<ArgumentException>
    
    是一个签名为
    unit->Category
    的函数,但您并不真正关心返回的
    Category

    相反,你可以把它写成

    (fun () -> Category(String.Empty, CategoryType.Terminal)
    
    []
    let``名称不应为空``()=
    (fun()->Category(String.Empty,CategoryType.Terminal)|>ignore)
    |>应该抛出类型
    

    注意添加的
    ignore
    关键字,它忽略了
    Category
    返回值。此测试通过,如果删除Guard子句,则会失败。

    如果下载源代码并在windows上构建,则围绕异常测试的某些单元测试会失败。我只是在学习F#,所以我无法解决这个问题。哦,亲爱的,谢谢你的链接。。。我敢肯定,当我尝试上面的代码时,它是有效的,我也在运行Windows。。。这就是我问的原因。这可能是一个在过渡期间出现的问题。无论如何,我不使用FsUnit,因为我发现它更好。
    [<Fact>]
    let ``name should not be empty``() =
        (fun () -> Category(String.Empty, CategoryType.Terminal) |> ignore)
        |> should throw typeof<ArgumentException>