我能知道 Xunit 中失败的实际表达式吗?

Can I know the actual expression that failed in Xunit?

假设我有一个使用 Xunit 的测试,如下所示:

module Tests

open System
open Xunit

let isSquare x = 
  let root = sqrt x
  root % 1 = 0

[<Fact>]
let ``Various tests`` () =
  let whitelist = 
    [
      1
      4
      9
      9481129 // Will trigger failure
      16
      25
    ]

  for x in whitelist do
    Assert.True (isSquare x)

  let blacklist = 
    [
      3
      26
      101
    ]

  for x in blacklist do
    Assert.False (isSquare x)

当我运行这个测试时,失败信息不是很有用:

 [xUnit.net 00:00:00.98]  ... Error Message:
   Assert.False() Failure
Expected: False
Actual:   True
  Stack Trace: ...

它给了我断言的行号,但我真正想要的是失败的 xvalue

理想情况下是这样的:

Assertion failed for: 

  Assert.True (isSquare 9481129)

是否可以使用 Xunit 执行此操作,即使是长列表或生成的 white/black 列表?

我目前的解决方法是添加打印语句,这并不理想。

Assert.True 采用第二个可选参数 - 表示将打印的消息的字符串。您可以使用它来生成您想要的任何消息:

for x in whitelist do
    Assert.True(isSquare x, sprintf "Apparently %d is not a square" x)

您考虑过使用 Theory 吗?

[<Theory>]
[<InlineData(1)>]
[<InlineData(4)>]
[<InlineData(9)>]
[<InlineData(9481129)>]
[<InlineData(16)>]
[<InlineData(25)>]
let ``Is square`` num =
   Assert.True (isSquare num)

然后测试运行程序会告诉您哪些情况导致测试失败:

Tests.Is square(num: 9481129) [FAIL]
   Assert.True() Failure 
   Expected: True
   Actual:   False
   Stack Trace: ...