При попытке предоставить поддельный делегат для метода с необязательным параметром в поддельном объекте
type MyType () =
abstract B: ?s:string -> unit
default x.B (?s: string) = Option.iter (printfn "Implemented: %s") s
[<Property>]
let doit () =
let a = A.Fake<MyType>()
A.CallTo(fun () -> a.B(ignored())).Invokes(fun s -> Option.iter (printfn "Faked: %s") s)
a.B "Hello"
FakeItEasy жалуется
FakeItEasy.Configuration.FakeConfigurationException: ограничение аргумента имеет тип System.String, но параметр имеет тип Microsoft.FSharp.Core.FSharpOption`1[System.String]. Ни один вызов не может соответствовать этому ограничению.
Есть ли способ сделать это без изменения определения типа?
Если я использую A<string>.Ignored
вместо ignored()
, я получаю другую ошибку: Ограничение аргумента, такое как That, Ignored или _, не может быть вложено в аргумент.
Пример сбивает меня с толку из-за 2 типов A
. Может быть, переименовать свой A в MyExample?
Извинения на обоих фронтах. Я обновил вопрос, чтобы свести к минимуму путаницу, и @Brian Berns у вас было правильное определение.
ОК, я смог воспроизвести ваше сообщение об ошибке, определив ignored
как:
let ignored<'t> () = A<'t>.Ignored
Проблема в том, что вы определили строковое ограничение для аргумента, который на самом деле является строковым параметром. Вы можете обойти это, явно назвав параметр ?s
при вызове члена, например:
A.CallTo(fun () -> a.B(?s=ignored())).Invokes(fun s -> Option.iter (printfn "Faked: %s") s)
Теперь ограничение имеет правильный тип, Option<string>
, и код выполняется без ошибок. Выход:
Faked: Hello
Этот ТАК ответ содержит более подробную информацию об указании значений для необязательных аргументов.
Гениально и очень ценно. Работает как удовольствие
Здесь недостаточно информации, чтобы воспроизвести то, что вы видите (по крайней мере, для меня). Каково определение
ignored
в этом примере?