gpt4 book ai didi

f# - 使用 FSUnit.Xunit 测试集合

转载 作者:行者123 更新时间:2023-12-02 21:06:13 38 4
gpt4 key购买 nike

我正在尝试使用 FSUnit(特别是其 Xunit 分支)测试 F# 中两个集合的相等性,但到目前为止失败得很严重。

我有一个函数,它返回某些结构的数组,并想测试返回的数组是否正确。我正在测试的代码是用 C# 编写的,因此该函数无法返回 native F# 列表。

我尝试过的最有希望的方法如下:

[<Fact>]
let SimpleTest() =
let parser = new ExpressionParser()
parser.ParseExpression "2" |> should equal [new ParsedItem("2", ParsedItemType.Value)]

...但它导致测试失败,因为:

"Message> FSUnit.Xunit+MatchException: Exception of type 'FsUnit.Xunit+MatchException' was thrown. 

Expected value: Equals [(2)]
Actual: was [2]

我可以看到这是因为 native F# 列表的类型与 native 数组不匹配,但老实说我不知道​​(我也没有在文档中找到任何内容)如何以不同的方式执行此操作(除了预先创建 native 数组并填充一点一点地...)。

我还尝试了一些其他方法,但它们通常甚至无法编译。


PS:我对 F# 和 Xunit 都是全新的,所以我可能会错过一些绝对明显的东西。

编辑:评论中建议了一种实际上效果更好的解决方法(比较字符串表示形式而不是对象本身),虽然我将在实际代码中使用它,但我仍然很欣赏真正的解决方案我上面的问题。

最佳答案

虽然您无法轻松地从 C# 代码返回 F# 列表,但一种选择是返回数组。它们具有结构相等性,因此您可以简单地比较它们来确定它们是否彼此相等:

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# 单元测试,您可能需要 view my Pluralsight course on the topic .

关于f# - 使用 FSUnit.Xunit 测试集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35874853/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com