我正在尝试为一个小的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,它对实现的依赖性较小。
我尝试直接将模拟函数分配给Printf.printfn
无济于事(很明显,当我想到这一点时)。是否可以将输出捕获到控制台?或模拟printfn
函数(这是一个实现细节,但我可以接受)。
答案 0 :(得分:0)
这就是我用来测试的东西:
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
,前者返回函数值和输出,后者仅返回输出