1

我正在尝试使用 Pose (https://github.com/tonerdo/pose)来填充,printfn以便我可以对传递给它的内容进行单元测试。如果我传递一个TextWriterFormat不带附加参数的,我已经设法让它工作,但是当我尝试填充一个带附加参数的,我得到一个不匹配的实例类型异常

这有效:

let workingPrintfTest () =
    let a = Printf.TextWriterFormat<unit>("herp")
    Printf.printfn a

let workingShim =
    Shim
        .Replace(fun () ->
            Printf.printfn(Is.A<Printf.TextWriterFormat<unit>>())
        )
        .With(Func<Printf.TextWriterFormat<unit>, unit>(fun s ->
            Console.WriteLine("Hijacked: " + s.ToString())
        ))

    PoseContext.Isolate ((fun () ->
        Program.workingPrintfTest ()   // Hijacked: herp
    ), workingShim)

但是,当我更改herp为时herp: %sTextWriterFormatTextWriterFormat<string -> unit>我得到不匹配的实例类型异常时。

这会引发异常:

let printfTest toPrint =
    let a = Printf.TextWriterFormat<string -> unit>("herp: %s")
    Printf.printfn a toPrint

let shim =
    Shim
        .Replace(fun () ->
            let a = Is.A<Printf.TextWriterFormat<string -> unit>>()
            Printf.printfn a (Is.A<string>())
        )
        .With(Func<Printf.TextWriterFormat<string -> unit>, unit>(fun s ->
                Console.WriteLine("Hijacked: " + s.ToString())
                ()
            )
        )

PoseContext.Isolate ((fun () ->
    Program.printfTest "www"
), shim)

以及伴随的例外:Pose.Exceptions.InvalidShimSignatureException: Mismatched instance types

我在 .Net Core 2.2 中运行它

任何帮助,将不胜感激。

4

0 回答 0