当我用 NUnit 2.6.3 运行这个 FsUnit 测试时,
let f xs = Some (List.map ((+) 2) xs)
[<Test>]
let test() =
f []
|> should equal (Some [])
我得到:
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))
有几个人被这个咬了,例如Weird None behaviour in type providers .
一旦它们不再是类型安全的,流畅的断言之美对我来说就毫无意义了。我建议创建一个 type-safe alternative :
let shouldEqual (x: 'a) (y: 'a) =
Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y)
关于f# - FsUnit `should equal` 在 `Some []` 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23989847/