考慮對一個模塊進行單元測驗,該模塊將長度受限的字串定義為表示用戶名的型別:
module UserName
type T = UserName of string
let create (userName : string) =
if userName.Length >= 6 && userName.Length <= 16
then Some (UserName userName)
else None
let apply f (UserName userName) = f userName
let value userName = apply id userName
確保函式None為無效輸入回傳的單元測驗看起來很簡單:
[<Fact>]
let ``UserName must have at least six characters`` () =
UserName.create "aaa" |> should equal None
但是,對于函式回傳的情況的單元測驗Some似乎需要額外的一行來確保match運算式的完整性:
[<Fact>]
let ``Valid UserName`` () =
match UserName.create "validname" with
| Some result ->
UserName.value result |> should equal "validname"
| None -> Assert.True(false)
這在我看來并不正確,因為我的測驗必須定義代碼來測驗無論如何都必須產生失敗的“不愉快”路徑。
我希望我能寫這個
[<Fact>]
let ``Valid UserName`` () =
UserName.create "validname" |> should equal (Some (UserName "validname"))
但它不會編譯(未定義值或建構式“UserName”)。
有沒有辦法撰寫一個回傳函式的單元測驗option<T>,它不需要對“不愉快”路徑(例如| None -> Assert.True(false))進行顯式檢查?我愿意向模塊添加更多型別和/或函式以UserName使其更易于測驗。
uj5u.com熱心網友回復:
應用value到里面Some然后比較:
UserName.create "validname"
|> Option.map UserName.value
|> should equal (Some "validname")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/397955.html
