Заглушить запись в F#
Поскольку записи F# действительно запечатаны, я не могу заглушить тип записи. Есть ли атрибут, который я могу поставить в записи в F#, чтобы он не был скомпилирован как запечатанный, чтобы я мог заглушить запись?
type Quote = {a:string}
mock<Quote>
это броски
System.TypeLoadException: не удалось загрузить тип 'Castle.Proxies.QuoteProxy' из сборки 'DynamicProxyGenAssembly2, версия =0.0.0.0, Culture= нейтральный, PublicKeyToken=null', так как родительский тип закрыт.
И если тебе любопытно. Это определение для макета:
let mock<'typee when ^typee : not struct> = Substitute.For<'typee>()
1 ответ
Я не думаю, что есть способ сказать F# компилятору генерировать F# запись как незапечатанный класс.
Однако вопрос в том, почему ты хочешь заглушить запись? Насколько я понимаю, заглушки используются для имитации некоторой функциональности типа. Однако F# записи генерируются компилятором, поэтому, если вы доверяете F# компилятору, вам не нужно имитировать их, потому что они всегда будут вести себя предсказуемо.
Если вы хотите добавить некоторых участников в запись, вы можете поиздеваться над ними. Для этого вы можете определить интерфейс, реализовать его в типе записи и сгенерировать заглушку для интерфейса:
type IFoo =
abstract Foo : int -> int
type Bar =
{ Number : int }
interface IFoo with
member x.Foo(n) = n + x.Number
Как правило, код, написанный в функциональном стиле, можно проверить, просто проверив, дает ли операция правильный результат для указанных входных данных. Проверка того, что внутренняя реализация вызывает какую-то другую операцию (например, использование заглушек), менее необходима. Конечно, это не всегда применимо к реальному сценарию, когда вы взаимодействуете с другими компонентами...