Skip to content

How to mock a function (not a member)? #34

@arialdomartini

Description

@arialdomartini

Description

While mocking a type's member is super convenient, I found no way to mock a bare function, not hosted in any type. Or, at least, I was able to mock it, but assertions seem fail.

Replacing a function with a test double requires no library: it is just a matter of defining the replacing function and using it instead of the original one.
My goal, though, is then verify if the function was called and with which arguments.

When I try, I get a

Repro steps

I can easiliy replace a method with:

type MyInterface =
    abstract CallMe: string : string -> string

[<Fact>]
let ``mock a method``() =

    let mock = Mock.Of<MyInterface>()

    verify <@ mock.CallMe "Hello" @> never

    mock.CallMe "Hello"

    verify <@ mock.CallMe "Hello" @> once

If I try to do the same with a function:

type MyFunc = string -> string

[<Fact>]
let ``mock a naked function``() =

    let mock = Mock.Of<MyFunc>()

    verify <@ (mock "Hello") @> never


    mock "Hello"

    verify <@ (mock "Hello") @> once

I get a:

System.NotSupportedException
Expected function application: ValueWithName (<fun:FSharpFunc`257856397-a910-4815-8fa8-bb79a503eb1e>, mock)
   at Foq.Reflection.unwrap@736(FSharpFunc`2 toArgs', FSharpList`1 values, FSharpExpr quote)
   at Foq.Reflection.unwrap@736-1.Invoke(FSharpList`1 values, FSharpExpr quote)
   at Foq.Mock.DoVerify(FSharpExpr expr, Times expectedTimes)
   at SAI.AbsenceCollector.Test.Core.mock a naked function() in C:\Core.fs:line 35

The failure occurs at

verify <@ (mock "Hello") @> never

Expected behavior

I expected both the asserts to pass.

Actual behavior

A System.NotSupportedException.

Known workarounds

I found none.

Related information

  • Windows, Linux
  • Foq 1.8.0
  • .NET 5

There is a discussion on this topic on StackOverflow's Using Foq With F# Function Types

Any hints?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions