2016-04-29 2 views
1

У меня есть следующий код с помощью теста, который терпит неудачу:Модульное тестирование: «[] |> должна равняться 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' было выброшено. Ожидаемый: Равно []
Фактический: был []

+1

Вы пытались использовать '' |> должен быть Empty'' вместо этого? –

+0

Это работает. Спасибо, Бартек. Странно, что равный не работает. Я буду исследовать fsunit для этого. –

+0

Интересует: [FsUnit 'should equal' терпит неудачу на' Некоторые [] '] (http://stackoverflow.com/questions/23989847/fsunit-should-equal-fails-on-some) –

ответ

6

equal в FsUnit делает некоторые фантазии матч были be только функция тождества. Here is the link source

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

|> should be Empty 
7

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

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

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

5 |> should equal "abc" 

Это, конечно, не удастся во время выполнения, красиво показывая вам, что ценности не являются, по сути, равными.

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

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

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

+1

Может быть комментарий, но стоит комментарий upvote, но поскольку это ответ, единственный способ дать комментарий, upvote - увеличить его как ответ. Таким образом, мой прогноз относится к комментарию в качестве комментария вверх. –

+0

Спасибо за разъяснение. Потрясающие. –

Смежные вопросы