我想在不调用fun2的情况下对fun1进行单元测试。
let fun2() =
// Some complex function with lots of dependencies.
1
let fun1() =
fun2() * 2
打破两个函数之间依赖关系的最佳方法是什么?
我尝试了几种不同的方式,但它们只是增加了混乱。
将fun2传递给fun1
let fun1(fun2) =
fun2() * 2
转换为类并覆盖
type FunClass() =
abstract member fun2 : unit -> int
default x.fun2() = 1
member x.fun1() =
x.fun2() * 2
type FunClassMock() =
override member x.fun2() = 1
使用状态模式
type Fun1Class(fun2Class) =
member x.fun1() =
fun2Class.fun2() * 2
使用变量
let fun2Imp() =
1
let mutable fun2 = fun2Imp
let fun1() =
fun2() * 2
有更清洁的方式吗?
答案 0 :(得分:3)
这取决于您的使用情况,但您可以这样做:
let fun2() =
// Some complex function with lots of dependencies.
1
let createFun1 fun2 =
fun () -> fun2() * 2
let fun1 = createFun1 fun2
这对于单元测试也很有用,因为你可以通过简单地为fun2传递一个简单的函数来测试fun1。
答案 1 :(得分:2)
它不是很灵活,但编译器指令可以工作。
let fun2() =
#if TESTING
1
#else
// Some complex function with lots of dependencies.
#endif
在单独的模块中定义fun2
,open
所需模块是另一种选择。
module Impl =
let fun2() =
// Some complex function with lots of dependencies.
module Testing =
let fun2() = 1
答案 2 :(得分:1)
你做任何事情(至少我知道)将会增加混乱"。这样的事情怎么样?
let fun1() =
fun1_impl(fun2)
let fun1_impl(fun2) =
fun2() * 2
然后,在常规代码中,使用fun1
,并在测试中使用fun1_impl
。
答案 3 :(得分:0)
总的来说,论证的传递似乎是最干净的。
杂乱的影响可能不会在技术上解决,但在语义上:它来自于它似乎有点武断,因为“function1”缺乏附加意义。
是否可能存在更高,更连贯的级别,可能在您的代码中更有意义?