F# Xunit列表应该包含一个x,使得fx

F# Xunit列表应该包含一个x,使得fx,f#,xunit,fsunit,F#,Xunit,Fsunit,我不知道如何在FsUnit.Xunit中编写测试 我想检查列表中至少有一个元素满足谓词。我知道如何使用编写此代码应该是正确的,但通常使用专用函数可以获得更好的错误消息 希望这段代码清楚地说明了我要实现的目标: 打开Xunit 打开FsUnit.Xunit 类型Foo= { X:int } [] 让``squares``()= 让xs= [{X=1};{X=2};{X=3}] |>List.map(fun foo->{X=foo.X*foo.X}) 实际的 |>应该存在(满足(fun foo->f

我不知道如何在
FsUnit.Xunit
中编写测试

我想检查列表中至少有一个元素满足谓词。我知道如何使用
编写此代码应该是正确的
,但通常使用专用函数可以获得更好的错误消息

希望这段代码清楚地说明了我要实现的目标:

打开Xunit
打开FsUnit.Xunit
类型Foo=
{
X:int
}
[]
让``squares``()=
让xs=
[{X=1};{X=2};{X=3}]
|>List.map(fun foo->{X=foo.X*foo.X})
实际的
|>应该存在(满足(fun foo->foo.X=9))//不是真正的代码
我会这样做:

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 }]
应为:包含
实际值:[{X=1};{X=4};{X=9}]

这种方法唯一的缺点是“预期”消息不再显示您正在查找的特定值。

这不是一个坏的解决方案,尽管错误消息现在失去了额外的上下文(想象
Foo
包含更多成员),但我想我找到了您想要的:
FsUnit.CustomMatchers.containf
。将相应地更新答案。我认为
containf
是我们将要做的最好的选择!