Заглушить запись в 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

Как правило, код, написанный в функциональном стиле, можно проверить, просто проверив, дает ли операция правильный результат для указанных входных данных. Проверка того, что внутренняя реализация вызывает какую-то другую операцию (например, использование заглушек), менее необходима. Конечно, это не всегда применимо к реальному сценарию, когда вы взаимодействуете с другими компонентами...

Другие вопросы по тегам