Модульное тестирование: "[] |> должен равняться List.empty" не работает должным образом

У меня есть следующий код с тестом, который не проходит:

open Xunit
open FsUnit.Xunit

let rec openOrSenior xs = 
    match xs with
    | head :: tail when fst head >= 55 && snd head >= 7 -> "Senior" :: openOrSenior tail
    | head :: tail -> "Open" :: openOrSenior tail
    | [] -> []

[<Fact>]
let ``empty input gives empty result``() =
    openOrSenior [] |> should equal List.empty

Тест не пройден со следующей ошибкой соответствия

FsUnit.Xunit+MatchException: было сгенерировано исключение типа 'FsUnit.Xunit+MatchException'. Ожидаемый: равно []
Фактически: было []

2 ответа

Решение

equal в FsUnit какой-то модный матч был be это просто функция идентичности. Вот ссылка на источник

Ваш чек будет в порядке, если вы используете:

|> should be Empty

Этот ответ просто для выяснения причин этого. Это оказалось слишком длинным для комментария.

Это ситуация несоответствия типов. Два значения [] а также [] выглядят одинаково при распечатке, но на самом деле имеют разные типы: "фактическое" значение string list, но "ожидаемое" значение obj list,

Это происходит потому, что List является общим, и should equal не требует, чтобы "ожидаемый" и "фактический" имели один и тот же тип, тем самым предотвращая включение вывода типа. Например, это компилирует:

5 |> should equal "abc"

Конечно, он потерпит неудачу во время выполнения, хорошо показывая, что значения на самом деле не равны.

Но если одно из ваших значений является универсальным в возвращаемом типе:

let a: int list = []
a |> should equal []

тогда отсутствие вывода типа означает, что это значение в конечном итоге будет иметь тип obj и, следовательно, не строго говоря, "равно" другому значению, которое имеет другой тип.

Другие вопросы по тегам