Могу ли я узнать фактическое выражение, которое не удалось в Xunit? - PullRequest
0 голосов
/ 30 января 2020

Предположим, у меня есть тест с использованием 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 там, где это не удалось.

В идеале что-то вроде этого:

Assertion failed for: 

  Assert.True (isSquare 9481129)

Возможно ли это сделать с Xunit, даже с длинными или сгенерированными белыми / черными списками?

Моя текущая работа -around это добавить операторы печати, что не идеально.

Ответы [ 2 ]

4 голосов
/ 30 января 2020

Рассматривали ли вы вместо этого 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: ...
1 голос
/ 30 января 2020

Assert.True принимает второй необязательный параметр - строку, представляющую сообщение, которое будет напечатано. Вы можете использовать это, чтобы генерировать любые сообщения, которые вы хотите:

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