f# - FsUnit `should equal` 在 `Some []` 上失败

标签 f# nunit fsunit

当我用 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/

相关文章:

arrays - F#:为什么 Array.createZero 这么快?

F# 尾递归函数示例

visual-studio-2013 - Visual Studio FsUnit 测试设置 - 异常 NUnit.Engine.NUnitEngineException

f# - 构造函数中的 fsunit.xunit 测试异常

f# - 使用 FsUnit.Xunit 断言异常消息

f# - 在 Mono 下运行 F# 3 生成的可执行文件

f# - 功能范例中的可插拔性

f# - FsUnit 不匹配异常 - F#

c# - 如何断言是否使用 nunit 调用了方法

c# - "Hello World"- TDD 方式?