如何打破 F# 中的函数依赖性?

Kei*_*son 5 f# unit-testing

我想对 fun1 进行单元测试而不调用 fun2。

\n\n
let fun2() =\n    // Some complex function with lots of dependencies.\n    1\n\nlet fun1() =\n    fun2() * 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

打破两个函数之间的依赖关系的最佳方法是什么?

\n\n

我\xe2\x80\x99尝试了几种不同的方法,但它们只会增加混乱。

\n\n

将 fun2 传递给 fun1

\n\n
let fun1(fun2) =\n    fun2() * 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

转换为类并覆盖

\n\n
type FunClass() =\n    abstract member fun2 : unit -> int\n    default x.fun2() = 1\n\n    member x.fun1() =\n        x.fun2() * 2\n\ntype FunClassMock() =\n    override member x.fun2() = 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用策略模式

\n\n
type Fun1Class(fun2Class) =\n\n    member x.fun1() =\n       fun2Class.fun2() * 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用变量

\n\n
let fun2Imp() =\n    1\n\nlet mutable fun2 = fun2Imp\n\nlet fun1() =\n    fun2() * 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

有更干净的方法吗?

\n

jny*_*len 1

任何方式(至少据我所知)都会“增加混乱”。像这样的事情怎么样?

let fun1() = 
    fun1_impl(fun2)

let fun1_impl(fun2) =
    fun2() * 2
Run Code Online (Sandbox Code Playgroud)

然后,在常规代码中使用fun1,在测试中使用fun1_impl