Макет `printfn` в тестах F # - PullRequest
       7

Макет `printfn` в тестах F #

0 голосов
/ 15 октября 2018

Я пытаюсь написать тест для небольшой библиотеки. Я пишу, что (по сути) просто регистрируется в консоли.

Есть ли способ смоделировать функцию, например 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 (или, в идеале, что отправляется в стандартный вывод, который меньше зависит от реализации).

IЯ пытался напрямую назначить фиктивную функцию для Printf.printfn безрезультатно (очевидно, когда я думаю об этом).Возможно ли захватить вывод на консоль?Или издеваться над функцией printfn (это детали реализации, но я могу жить с этим).

1 Ответ

0 голосов
/ 15 октября 2018

Это то, что я использую для тестирования:

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, что является бесшумной версией.

Для проверки вывода Iсделать это следующим образом:

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 первый возвращает значение функциии вывод, последний возвращает только вывод

...