我正在寻找能够利用该语言的独特功能的框架.我知道FsUnit.你会推荐别的吗?为什么?
有一个类型提供程序,它有三个属性'a','b'和'c',分别是'string','string option'和'int option'.
当我在这些属性中有"","无"和"1"的实例时,会失败:
(row1.a, row1.b, row1.c) |> should equal ("", None, Some 1)
Run Code Online (Sandbox Code Playgroud)
但所有这些工作都很好:
row1.a |> should equal ""
row1.b |> should equal None
row1.c |> should equal (Some 1)
("", None, Some 1) |> should equal ("", None, Some 1)
Run Code Online (Sandbox Code Playgroud)
这怎么可能?什么可以使b中的None与其他None不同?编译后,None只是一个null,在.Net中两个空值是否可以不同?
与大多数F#类型一样,元组具有结构相等性,因此它应该可以工作.我得到一个带有Message的NUnit.Framework.AssertionException:
Expected: <(, , Some(1))>
But was: <(, , Some(1))>
Run Code Online (Sandbox Code Playgroud)
NUnit只调用.Equals,这就是问题所在.
这也失败了:
(row1.a, row1.b, row1.c).Equals(("", None, Some 1)) |> should equal true
Run Code Online (Sandbox Code Playgroud)
运行时类型row1是System.Tuple<string,Microsoft.FSharp.Core.FSharpOption<string>,Microsoft.FSharp.Core.FSharpOption<int>>,所以即使这应该在理论上工作:
row1 |> should equal ("", None, Some 1)
Run Code Online (Sandbox Code Playgroud)
事实上,当None …
我有以下代码,测试失败:
open Xunit
open FsUnit.Xunit
let rec openOrSenior xs =
match xs with
| head :: tail when fst head >= 55 && snd head >= 7 -> "Senior" :: openOrSenior tail
| head :: tail -> "Open" :: openOrSenior tail
| [] -> []
[<Fact>]
let ``empty input gives empty result``() =
openOrSenior [] |> should equal List.empty
Run Code Online (Sandbox Code Playgroud)
测试失败,出现以下匹配错误
FsUnit.Xunit + MatchException:抛出了类型'FsUnit.Xunit + MatchException'的异常.预期:等于[]
实际:是[]