gpt4 book ai didi

generics - 将 NUnit 与通用可区分联合结合使用

转载 作者:行者123 更新时间:2023-12-03 06:27:15 28 4
gpt4 key购买 nike

我正在尝试使用 FsUnit(在幕后它使用 NUnit)来测试我的 F# 代码,但它在处理通用可区分联合时遇到问题。我理解为什么会发生这种情况,但我正在尝试找到一种在不注释我的预期值的情况下编写测试的方法。有什么建议吗?是否有更适合于此的框架?

type OptionWithReason<'a> =
| Some of 'a
| None of string

let reason = "division by 0 is not yet supported"
let safeDivide x y =
if y = 0 then
None reason
else
Some(x/y)

let result = safeDivide 1 0

let expected = None reason
let expectedExplicit: int OptionWithReason = None reason

let test1 = result = expected //true
let test2 = result = expectedExplicit //true

NUnit.Framework.Assert.AreEqual(expectedExplicit,result) //pass
NUnit.Framework.Assert.AreEqual(expected,result) //fail :(

最佳答案

代码中的部分问题是 Assert.AreEqual 将两个参数作为 obj ,因此编译器不知道类型应该相同 -如果它知道这一点,那么它会推断 expected 的类型为 int OptionWithReason (以与 result 匹配)。

解决这个问题的一个简单方法是为 areEqual 定义一个辅助函数,它接受相同类型的参数:

let areEqual (first:'T) (second:'T) = 
NUnit.Framework.Assert.AreEqual(first, second)

现在您可以将断言写为:

areEqual expected result

编译器将推断 expectedresult 的类型相同,并且应该可以工作。

关于generics - 将 NUnit 与通用可区分联合结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47816810/

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