【问题标题】:NSubstitute and FSharp - Mocking an FSharp FunctionNSubstitute 和 FSharp - 模拟 FSharp 函数
【发布时间】:2017-04-24 04:38:54
【问题描述】:

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

【问题讨论】:

    标签: f# mocking


    【解决方案1】:

    第一:是的,你完全可以像普通方法一样模拟这个:

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

    这更简洁,类型检查更好,运行时速度更快。

    【讨论】:

    • 同意使用内联接口实现的建议(通常称为object expressions)。通常,当您编写 F# 代码时,通常不必跳过三打环来使单元测试正常工作。模拟、存根、依赖注入……如果您正在编写纯函数式代码,所有这些都可以简化。 Mark Seemann 写了很多关于这个主题的good blog posts
    • 如果你使用object expressions,那你不是必须实现接口的每个成员吗?
    • 是的,你会的。这就是你必须使你的接口变小的原因之一。甚至面向对象的人也建议这样做。
    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多