我能知道 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: ...
它给了我断言的行号,但我真正想要的是失败的 x
的 value。
理想情况下是这样的:
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: ...
假设我有一个使用 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: ...
它给了我断言的行号,但我真正想要的是失败的 x
的 value。
理想情况下是这样的:
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: ...