NSubstitute和FSharp - 模拟FSharp函数

时间:2017-04-24 04:38:55

标签: f# mocking

给定一个具有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函数。

1 个答案:

答案 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"] }

这是更干净,更好的类型检查,并且在运行时更快。