我试图使用F# (特别是Xunit分支)测试两个集合在FSUnit中的相等性,但到目前为止失败得很。
我有一个函数,它返回某个结构的数组,并希望测试返回的数组是否正确。我正在测试的代码是用C#编写的,因此函数不能返回本机F#列表。
我尝试过的最有希望的方法是:
[<Fact>]
let SimpleTest() =
let parser = new ExpressionParser()
parser.ParseExpression "2" |> should equal [new ParsedItem("2", ParsedItemType.Value)]...but它导致测试失败,原因是:
"Message> FSUnit.Xunit+MatchException: Exception of type 'FsUnit.Xunit+MatchException' was thrown.
Expected value: Equals [(2)]
Actual: was [2]我可以看到,这是因为本机F#列表的类型与本机数组不匹配,但诚实地说(我在文档中也没有发现任何东西)如何进行不同的操作(除了预先创建本机数组并逐个填充它.)。
我也尝试过其他一些方法,但它们通常都不会编译。
PS:我对F#和Xunit都很陌生,所以我可能遗漏了一些非常明显的东西。
编辑:--在注释中提出了更好的解决方法(比较字符串表示而不是对象本身),虽然我将在实际代码中使用它,但我仍然希望找到解决上述问题的真正解决方案。
发布于 2016-03-08 20:09:21
好吧,我找到了答案,比我想象的要简单。首先,支持工作得很好,问题是语法方面的问题,而我不费心地阅读关于如何在F#中创建数组的文档并猜测它。
有两件事不对。首先,[new ParsedItem("2", ParsedItemType.Value)]不创建数组,而是创建列表。对于FSUnit的should equal来说,这本身并不是一个问题,但使用=进行简单的结构相等测试就足够了。
错误的第二件事是,我并没有与[new ParsedItem("2", ParsedItemType.Value)]进行比较,我与[new ParsedItem("2", ParsedItemType.Value), new ParsedItem("+", ParsedItemType.Operator), new ParsedItem("3", ParsedItemType.Value)]相比,实际上创建了一个包含一个圆环的列表。而这一点--毫不奇怪--并没有很好地断言:)
只需阅读文档并了解应该创建一个数组,[|new ParsedItem("2", ParsedItemType.Value); new ParsedItem("+", ParsedItemType.Operator); new ParsedItem("3", ParsedItemType.Value)|]就修复了这个问题。
不管怎么说,谢谢你的评论和另一个答案。虽然他们没有回答我的问题,但他们增加了我对F#的了解,并给了我一个如何测试的新想法:)。
发布于 2016-03-08 20:13:21
虽然您不能轻松地从您的F#代码返回C#列表,但有一个选项是返回数组。它们在结构上是相等的,所以您可以简单地比较它们以确定它们是否相等:
open System.Linq
let csharpArray = Enumerable.Range(0, 10).ToArray()
let fsharpArray = [| 0..9 |]这两个数组是相等的:
> csharpArray = fsharpArray;;
val it : bool = true如果不想返回数组,还可以返回IEnumerable<T>,并在F#中转换为列表或数组:
> let csharpEnumerable = Enumerable.Range(0, 10);;
val csharpEnumerable : System.Collections.Generic.IEnumerable<int>
> csharpEnumerable |> Seq.toList = [0..9];;
val it : bool = true为了更全面地介绍使用F#进行单元测试的情况,您可能需要查看我的专业课程。
https://stackoverflow.com/questions/35874853
复制相似问题