[英]How can I break a function dependency in F#?
我想對fun1進行單元測試而不調用fun2。
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
有沒有更清潔的方法?
這取決於您的用法,但是您可以執行以下操作:
let fun2() =
// Some complex function with lots of dependencies.
1
let createFun1 fun2 =
fun () -> fun2() * 2
let fun1 = createFun1 fun2
這對於單元測試也很有用,因為您可以通過簡單地將一個簡單的函數傳遞給fun2來測試fun1。
它不是很靈活,但是可以使用編譯器指令。
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
您所做的任何方式(至少我知道)都會“增加混亂”。 這樣的事情怎么樣?
let fun1() =
fun1_impl(fun2)
let fun1_impl(fun2) =
fun2() * 2
然后,在常規代碼中使用fun1
,在測試中使用fun1_impl
。
一般而言,通過的論點似乎是最干凈的。
雜亂的影響可能不是從技術上解決的,而是從語義上解決的:這是因為它看起來有些武斷,這是由於缺少對“ function1”的附加含義。
在您的代碼中是否可能有更高,更連貫的層次可能更有意義?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.