Skip to content

Instantly share code, notes, and snippets.

@vasily-kirichenko
Created January 27, 2013 15:06
Show Gist options
  • Save vasily-kirichenko/4648781 to your computer and use it in GitHub Desktop.
Save vasily-kirichenko/4648781 to your computer and use it in GitHub Desktop.
Foq test
module FoqTest
open System
open Xunit
open Swensen.Unquote
open Foq
type ILogger = abstract Log: exn -> unit
type IService = abstract Translate: string -> string
type Translator(logger: ILogger, service: IService) =
static member ErrorMessage = "Translation failure"
member x.Translate(input: string) =
try
service.Translate(input)
with e ->
logger.Log(e)
Translator.ErrorMessage
// it's not necessary to place tests into a class
[<Fact>]
let ``Translate should return successful service response`` () =
let logger = Mock<ILogger>().Create()
let input, output = "Hello", "Kitty"
let service = Mock<IService>()
.Setup(fun me -> <@ me.Translate(input) @>).Returns(output)
.Create()
let translator = Translator(logger, service)
// Unquote assertions is extremely concise
translator.Translate(input) =? output
[<Fact>]
let ``When service fails Translate should return error message`` () =
let logger = Mock<ILogger>().Create()
let service = Mock<IService>()
.Setup(fun me -> <@ me.Translate(any()) @> ).Raises(Exception())
.Create()
let translator = Translator(logger, service)
translator.Translate("Hello") =? Translator.ErrorMessage
// in this test we don't have to catch the Translate() call and set the 'logged' flag
// Foq is smart enough to check that Logger.Log() was called with the same Exception instance
// that Service.Translate() returns.
[<Fact>]
let ``When service fails exception should be logged`` () =
let error = Exception()
let logger = Mock<ILogger>()
.Setup(fun log -> <@ log.Log(error) @>).Returns(())
.Create()
let service = Mock<IService>()
.Setup(fun me -> <@ me.Translate(any()) @> ).Raises(error)
.Create()
let translator = Translator(logger, service)
translator.Translate("Hello") |> ignore
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment