5

この FsUnit テストを NUnit 2.6.3 で実行すると、

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)

メッセージの Expected と Actual が同じであっても、テストは失敗します。どうしたの?

4

2 に答える 2

9

その理由は、FsUnit がボンネットの下で型指定されていないメカニズムを使用しているため、型チェッカーによってExpected推論されるためです(スタックトレースの部分を参照)。objectObject 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-02T09:21:24.423 に答える