FsUnit.Xunit 列表应该包含一个 x 使得 f x
FsUnit.Xunit list should contain an x such that f x
我不确定如何在 FsUnit.Xunit
中编写我的测试。
我想检查我的列表中至少有一个元素满足谓词。我知道如何使用 should be True
编写此代码,但通常您可以使用专门的函数获得更好的错误消息。
希望这段代码能清楚地说明我要实现的目标:
open Xunit
open FsUnit.Xunit
type Foo =
{
X : int
}
[<Fact>]
let ``squares`` () =
let xs =
[ { X = 1 }; { X = 2 }; { X = 3 } ]
|> List.map (fun foo -> { X = foo.X * foo.X })
actual
|> should exists (satisfies (fun foo -> foo.X = 9)) // Not real code
我会这样做:
xs
|> Seq.map (fun foo -> foo.X)
|> should contain 9
错误输出很有用:
Expected: Contains 8
Actual: seq [1; 4; 9]
如果您需要更多上下文,可以改为这样做:
open FsUnit.CustomMatchers
...
xs |> should containf (fun foo -> foo.X = 9)
错误输出为:
Expected: Contains <fun:squares@21-1>
Actual: [{ X = 1 }; { X = 4 }; { X = 9 }]
此方法的唯一缺点是“预期”消息不再显示您要查找的特定值。
我不确定如何在 FsUnit.Xunit
中编写我的测试。
我想检查我的列表中至少有一个元素满足谓词。我知道如何使用 should be True
编写此代码,但通常您可以使用专门的函数获得更好的错误消息。
希望这段代码能清楚地说明我要实现的目标:
open Xunit
open FsUnit.Xunit
type Foo =
{
X : int
}
[<Fact>]
let ``squares`` () =
let xs =
[ { X = 1 }; { X = 2 }; { X = 3 } ]
|> List.map (fun foo -> { X = foo.X * foo.X })
actual
|> should exists (satisfies (fun foo -> foo.X = 9)) // Not real code
我会这样做:
xs
|> Seq.map (fun foo -> foo.X)
|> should contain 9
错误输出很有用:
Expected: Contains 8
Actual: seq [1; 4; 9]
如果您需要更多上下文,可以改为这样做:
open FsUnit.CustomMatchers
...
xs |> should containf (fun foo -> foo.X = 9)
错误输出为:
Expected: Contains <fun:squares@21-1>
Actual: [{ X = 1 }; { X = 4 }; { X = 9 }]
此方法的唯一缺点是“预期”消息不再显示您要查找的特定值。