Проблема здесь в том, что компилятор не может определить тип, который ваш Result
будет иметь в случае сбоя, только из значения успеха Ok 2234567890UL
. Когда он не знает, он просто использует obj
и поэтому выводимый тип по умолчанию - Result<uint64, obj>
. Сравнение объектов разных типов всегда false
.
Это несколько прискорбно, потому что вы сравниваете два значения, поэтому они должны иметь одинаковый тип. Библиотека FsUnit
, которая обеспечивает операции should
и equal
, не является строго типизированной и позволяет сравнивать значения различных типов. Вы можете написать:
1 |> should equal "1"
Существует библиотека FsUnitTyped
, которая реализует типизированную версию FsUnit. У меня нет опыта с этим, но похоже, что вы могли бы использовать его и написать:
[<Fact>]
let ``Cleans the number`` () =
let expected = Ok 2234567890UL
let parsed = clean "(223) 456-7890"
parsed |> shouldEqual expected
Это решит вашу проблему - компилятор может сделать вывод, что тип expected
должен быть такой же, как тип parsed
, поэтому он будет автоматически использовать правильный тип.