【发布时间】:2016-03-09 05:39:03
【问题描述】:
我正在尝试使用 FSUnit(特别是它的 Xunit 分支)在 F# 中测试两个集合的相等性,但到目前为止都失败了。
我有一个函数,它返回一个特定结构的数组,并想测试返回的数组是否正确。我正在测试的代码是用 C# 编写的,所以函数不能返回原生 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]
我可以看到这是因为本机 F# 列表的类型与本机数组不匹配,但老实说不知道(我也没有在文档中找到任何内容)如何以不同的方式进行操作(除了事先创建本机数组并填充一一...)。
我也尝试了一些其他方法,但它们通常甚至无法编译。
PS:我对 F# 和 Xunit 都是全新的,所以我可能会遗漏一些绝对明显的东西。
编辑: 在 cmets 中建议了一种实际上效果更好的解决方法(比较字符串表示形式而不是对象本身),虽然我将在我的实际代码中使用它,但我仍然希望有一个真正的解决方案我上面的问题。
【问题讨论】:
-
并不是说我有答案,但可能会帮助其他人看到这个。使用 XUnit 是一项要求,还是可以改为使用 NUnit?
-
我可以毫无问题地更改为 NUnit,但更喜欢 FSUnit 原生解决方案。
-
您是否有任何理由无法将结构转换为可打印表单并比较可打印表单或编写自定义比较函数并调用它。我参与的一个项目将 FSUnit 与 NUnit 结合使用,我们以印刷形式对 AST 进行了很多比较。见Tests
-
ParsedItem类型是否定义了比较? -
1) 你说得对,我所说的 FSUnit 原生解决方案是我不想要“切换到 NUnit 并直接使用 Collection.Equal”之类的答案。 2) 比较可打印的表单听起来确实很有趣,但没想到这一点(甚至可以为我省去创建结果数组的麻烦)。 3) 好吧,它是一个结构意味着它有一个默认的 EqualityComparer,但它没有比较器,因为对它们进行排序没有意义。