簡體   English   中英

在F#測試中模擬`printfn`

[英]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

我正在測試的代碼稱為printoutfnprintoutfns ,這是靜默版本。

為了測試輸出,我這樣做:

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 paramStdOut.run func param前者返回函數值和輸出,后者僅返回輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM