F # - Как проверить исключение в конструкторе с помощью fsunit? - PullRequest
2 голосов
/ 27 марта 2019

Я хочу проверить, действителен ли аргумент, переданный конструктору типа .
Я проверяю это и поднимаю 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()

1 Ответ

1 голос
/ 27 марта 2019

Ваш первый подход хорошо работает для меня - мне просто нужно было определить configuration, который не включен в ваш вопрос, но, предположительно, определен где-то в вашем фактическом файле. Следующие компилируется и ведет себя как ожидалось для меня:

let configuration = { aaa = 1 }
Assert.Throws<ArgumentException>(fun () -> Client(configuration) |> ignore)

Ваш второй фрагмент кода не работает, поскольку он содержит ignore в неправильном месте - вы игнорируете всю функцию (которая содержит код, который вы хотите проверить), а затем передаете unit утверждению. Вызов ignore должен быть внутри функции, чтобы он игнорировал результат вызова конструктора. У меня работает следующее:

(fun() -> Client(configuration) |> ignore) |> should throw typeof<ArgumentException>
...