Модульное тестирование: "[] |> должен равняться 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
и, следовательно, не строго говоря, "равно" другому значению, которое имеет другой тип.