当我使用 NUnit 2.6.3 运行 FsUnit 测试时,
let f xs = Some (List.map ((+) 2) xs)
[<Test>]
let test() =
f []
|> should equal (Some [])
I get:
Result Message:
Expected: <Some([])>
But was: <Some([])>
Result StackTrace:
at FsUnit.TopLevelOperators.should[a,a](FSharpFunc`2 f, a x, Object y)
即使消息中的预期和实际相同,测试也会失败。发生了什么?
原因是 FsUnit 在幕后使用非类型化机制,因此Expected
被推断为object
由类型检查器(参见Object y
堆栈跟踪中的一部分)。
解决方法是为泛型值添加类型注释,即
[<Test>]
let test() =
f []
|> should equal (Some ([]: int list))
有几个人被这个咬过,例如类型提供者中奇怪的 None 行为.
一旦它们不再是类型安全的,流畅的断言之美对我来说就毫无意义了。我建议创建一个类型安全的替代方案:
let shouldEqual (x: 'a) (y: 'a) =
Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)