当我使用FsUnit 2.6.3运行这个NUnit测试时,
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)即使消息中的预期和实际情况相同,测试仍会失败。发生了什么?
发布于 2014-06-02 09:21:24
原因是FsUnit在掩码下使用了非类型机制,所以类型检查器将Expected推断为object (参见堆栈跟踪中的Object y部分)。
解决方法是为泛型值添加类型注释,即
[<Test>]
let test() =
f []
|> should equal (Some ([]: int list))有几个人被这个咬了,比如类型提供程序中的无异常行为。
流利的断言对我来说是毫无意义的,一旦它们不再是类型安全的。我建议创建一个类型安全替代方案
let shouldEqual (x: 'a) (y: 'a) =
Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y)发布于 2014-06-02 09:16:13
这是因为您的两个空列表是不同类型的。在测试的这个版本中,请参见actual和expected的类型:
[<Test>]
let test() =
let expected = Some []
let actual = f []
actual |> should equal expectedexpected是'a list option,实际是int list option,所以它们是不相等的。
如果您给编译器一些有关预期结果的提示,那么它就会工作。
[<Test>]
let test() =
f []
|> should equal (Some List.empty<int>)https://stackoverflow.com/questions/23989847
复制相似问题