f# - FsUnit.Xunit 列表应该包含一个 x 使得 f x

标签 f# xunit fsunit

我不确定如何在 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 }]

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

关于f# - FsUnit.Xunit 列表应该包含一个 x 使得 f x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66099569/

相关文章:

c# - 为什么用动态方法设置只读字段会导致此类错误?

f# - 定义同名的类型和模块时重复定义类型或模块

c# - XUnit 类夹具 (IClassFixture) 正在执行两次

f# - f# 中的参数化测试 - 这不是有效的常量表达式

F# 在 KeyNotFoundException 中添加值以映射结果

c# - 有没有办法在 xunit 测试类中的每个测试之前异步运行设置方法?

.net-core - 将 xUnit 项目升级到 .NET Core 2.1.1

f# - 将 TestCase 与 fsunit 一起使用

F# - 如何使用 fsunit 测试构造函数中引发的异常?

c# - 先学什么?