Created
January 27, 2013 15:06
-
-
Save vasily-kirichenko/4648781 to your computer and use it in GitHub Desktop.
Foq test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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