给定一个具有FSharp样式函数的接口。
type IUseless =
abstract member Listify: string -> int -> string list
你会如何嘲笑这个功能?
let substitute = NSubstitute.Substitute.For<IUseless>()
substitute.Listify.Returns(??? what would even go here ???)
我不希望能够像普通方法一样嘲笑它,或者包含一个函数的值(尽管它代表了它的代码)。
所以我很好奇是否有人使用典型的.NET模拟库成功模拟了FSharp函数。
答案 0 :(得分:6)
首先:是的,您可以像普通方法一样完全模仿:
let substitute = NSubstitute.Substitute.For<IUseless>()
(substitute.Listify "abc" 5).Returns ["whatevs"]
这很有效,因为F#编译这个定义就像普通的.NET方法一样,尽管语法很复杂。这部分是为了互操作而部分是为了表现。
但第二:如果我是你,我宁愿完全跳过整个NSubstitute
业务,而是使用内联接口实现:
let substitute = { new IUseless with member x.Listify a b = ["whatevs"] }
这是更干净,更好的类型检查,并且在运行时更快。