Вопрос

Имея

type Category(name : string, categoryType : CategoryType) = 
        do
            if (name.Length = 0) then
                invalidArg "name" "name is empty"

я пытаюсь проверить это исключение, используя FsUnit + xUnit:

[<Fact>]
let ``name should not be empty``() =
    (fun () -> Category(String.Empty, CategoryType.Terminal)) |> should throw typeof<ArgumentException>

но когда он запускается, я вижу XUnit.MatchException.Что я делаю не так?

  1. Исходный код теста
  2. Исходный код типа категории
Это было полезно?

Решение

Хотя я не являюсь экспертом по FsUnit, я думаю, что MatchException ожидается тип, поскольку FsUnit использует пользовательские сопоставители, и сопоставление не удается.

Однако тест в том виде, в котором он написан, кажется неверным, поскольку

(fun () -> Category(String.Empty, CategoryType.Terminal)

это функция с сигнатурой unit -> Category, но тебя не особо волнует вернувшееся Category.

Вместо этого вы можете написать это как

[<Fact>]
let ``name should not be empty``() =
    (fun () -> Category(String.Empty, CategoryType.Terminal) |> ignore)
    |> should throw typeof<ArgumentException>

Обратите внимание на добавленное ignore ключевое слово, которое игнорирует Category возвращаемое значение.Этот тест пройдет успешно и завершится неудачно, если вы удалите защитное предложение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top