我想检查传递给 type 的构造函数的参数是否有效。
我检查它并提出 ArgumentException (如果无效)。
我想为此行为创建一个测试。我想使用 Assert.throws 或最好使用 FSUnit 代替try / with块。
#package "FsUnit@3.4.1"
#package "nunit@3.11.0"
open System
open FSUnit
type configuration = {aaa:int}
type Client(conf:configuration) =
do
if conf.aaa < 3 then raise (ArgumentException("aaa must be at least 3"))
member this.do_something() =
()
//测试
// 1. does not "compile"
Assert.Throws<ArgumentException>(fun () -> Client(configuration) |> ignore)
// 2. does not work
//Assert.Throws<ArgumentException>( fun () ->
// let a = Client(configuration);
// a
// |> ignore)
// 3. does not work
(fun() -> Client(configuration)) |> ignore |> should throw typeof<ArgumentException>
// 4. OK but... bleah!
try
Client(configuration) |> ignore
Assert.Fail()
with
| :? ArgumentException -> Assert.Pass() |> ignore
| _ -> Assert.Fail()
答案 0 :(得分:1)
您的第一种方法对我来说很好用-我只需要定义configuration
,它不包含在您的问题中,但是大概是在您的实际文件中的某个位置定义的。以下代码对我的编译和行为符合预期:
let configuration = { aaa = 1 }
Assert.Throws<ArgumentException>(fun () -> Client(configuration) |> ignore)
您的第二个代码段不起作用,因为它在错误的位置放置了ignore
-您忽略了整个函数(包含要测试的代码),然后传递了unit
断言。 ignore
调用必须在函数的内部中,以便它忽略调用构造函数的结果。以下对我有用:
(fun() -> Client(configuration) |> ignore) |> should throw typeof<ArgumentException>