Mocking in F#

Mocking in F# is as easy as following the argument signature. Let’s say you depend on current time. Time is a function (unit -> DateTimeOffset). Want to time travel? Implement a function with that signature returning a specific time.

Mocking in F#
Code Snippet
type MembershipBenefit = Silver | Gold
let calculateBenefit (getCurrentTime: unit -> DateTimeOffset) (registrationDate: DateTimeOffset) = 
    let currentTime = getCurrentTime ()
    let daysRegistered = (currentTime - registrationDate).Days
    if daysRegistered > 10000 then
        Gold |> Some
    else if daysRegistered >= 2500 && daysRegistered <= 10000 then
        Silver |> Some
    else 
        None
// (unit -> DateTimeOffset) -> DateTimeOffset -> MembershipBenefit option
let registrationDate = new DateTimeOffset(1990,1,1, 1, 1, 1, TimeSpan.Zero)
let getCurrentTime () = DateTimeOffset.Now
calculateBenefit getCurrentTime registrationDate |> printfn "%A"
let someSpecificDate () = new DateTimeOffset(1991,1,1, 1, 1, 1, TimeSpan.Zero)
calculateBenefit someSpecificDate registrationDate |> printfn "%A"