[英]Mock `printfn` in F# tests
我正在嘗試為一個小的lib寫一個測試(實際上)只是記錄到控制台。
有沒有辦法像F#這樣模擬函數?
示例:在src / Lib / Lib.fs中
module Lib
let print msg = printfn "Your message is: %s" msg
然后,在test / LibTest / Lib.fs中
module LibTest
open NUnit.Framework
open FsUnit
[<Test>]
let ``should print what I expect``() =
print "test" |> should equal "Your message is: test"
注意:我知道當前的print
返回unit
-我正在尋找一種方法來斷言傳遞給printfn
(或更理想的情況是,發送給stdout的內容,它對實現的printfn
較小)。
我試圖直接將模擬函數分配給Printf.printfn
(顯然,當我考慮時)。 是否可以將輸出捕獲到控制台? 或模擬printfn
函數(這是一個實現細節,但我可以接受)。
這是我用於測試的內容:
module StdOut =
let stdout = System.Text.StringBuilder()
let out (s:string) = stdout.Append s |> ignore
let call func parm =
stdout.Clear() |> ignore
func parm, stdout.ToString()
let run f p = call f p |> snd
let inline (|>!) v f = f v ; v
/// used to capture print outs for testing. like printfn
let printoutfn fmt = fmt |> Printf.ksprintf (fun s -> s + "\n" |>! printf "%s"|> StdOut.out)
/// silent version of printoutfn
let printoutfns fmt = fmt |> Printf.ksprintf (fun s -> s + "\n" |> StdOut.out)
let printout v = printoutfn "%A" v
我正在測試的代碼稱為printoutfn
或printoutfns
,這是靜默版本。
為了測試輸出,我這樣做:
let print msg = printoutfn "Your message is: %s" msg
[<Test>]
let ``should print what I expect``() =
StdOut.run print "test" |> should equal "Your message is: test\n"
注意它如何包含換行符: \\n
。
有兩個調用: StdOut.call func param
和StdOut.run func param
前者返回函數值和輸出,后者僅返回輸出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.