Add thenCallRealImplementation.

This commit is contained in:
Filip Dolník 2016-06-26 10:04:47 +02:00
parent c310348d28
commit 020b92c9ff
8 changed files with 38 additions and 25 deletions

View File

@ -16,33 +16,35 @@ public class MockManager<STUBBING: StubbingProxy, VERIFICATION: VerificationProx
}
public func getter<T>(property: String, original: (Void -> T)? = nil) -> (Void -> T) {
public func getter<T>(property: String, original: (Void -> T)? = nil) -> T {
return call(getterName(property), parameters: Void(), original: original)
}
public func setter<T>(property: String, value: T, original: (T -> Void)? = nil) -> (T -> Void) {
public func setter<T>(property: String, value: T, original: (T -> Void)? = nil) {
return call(setterName(property), parameters: value, original: original)
}
public func call<IN, OUT>(method: String, parameters: IN, original: (IN -> OUT)? = nil) -> IN -> OUT {
return { try! self.callThrows(method, parameters: parameters, original: original)($0) }
public func call<IN, OUT>(method: String, parameters: IN, original: (IN -> OUT)? = nil) -> OUT {
return try! self.callThrows(method, parameters: parameters, original: original)
}
public func callThrows<IN, OUT>(method: String, parameters: IN, original: (IN throws -> OUT)? = nil) -> IN throws -> OUT {
public func callThrows<IN, OUT>(method: String, parameters: IN, original: (IN throws -> OUT)? = nil) throws -> OUT {
let stubCall = StubCall(method: method, parameters: parameters)
stubCalls.append(stubCall)
if let stub = (stubs[method]?.filter { $0.parameterMatchers.reduce(true) { $0 && $1.matches(parameters) } }.first) {
return {
switch stub.output($0) {
case .ReturnValue(let value):
return value as! OUT
case .Error(let error):
throw error
}
switch stub.output(parameters) {
case .ReturnValue(let value):
return value as! OUT
case .ThrowError(let error):
throw error
case .CallRealImplementation:
break
}
} else if let original = original {
return { try original($0) }
}
if let original = original {
return try original(parameters)
} else {
let message = "No stub for method `\(method)` using parameters \(parameters) and no original implementation was provided."
XCTFail(message)

View File

@ -1,12 +1,13 @@
//
// ReturnValueOrError.swift
// OnStubCall.swift
// Cuckoo
//
// Created by Filip Dolnik on 29.05.16.
// Copyright © 2016 Brightify. All rights reserved.
//
enum ReturnValueOrError {
enum OnStubCall {
case ReturnValue(Any)
case Error(ErrorType)
case ThrowError(ErrorType)
case CallRealImplementation
}

View File

@ -9,5 +9,5 @@
public struct Stub {
let name: String
let parameterMatchers: [AnyMatcher<Any>]
let output: Any -> ReturnValueOrError
let output: Any -> OnStubCall
}

View File

@ -33,7 +33,7 @@ public struct StubbingHandler {
return ToBeStubbedThrowingFunction(handler: self, name: method, parameterMatchers: parameterMatchers)
}
func createStubReturningValue<IN>(method: String, parameterMatchers: [AnyMatcher<IN>], output: Any -> ReturnValueOrError) {
func createStubReturningValue<IN>(method: String, parameterMatchers: [AnyMatcher<IN>], output: Any -> OnStubCall) {
let stub = Stub(name: method, parameterMatchers: parameterMatchers.map(AnyMatcher.init), output: output)
self.createNewStub(stub)

View File

@ -7,7 +7,7 @@
//
public struct ThenReturnValue<IN, OUT> {
let setOutput: (Any -> ReturnValueOrError) -> Void
let setOutput: (Any -> OnStubCall) -> Void
/// Invoke `implementation` when invoked.
public func then(implementation: IN -> OUT) {
@ -21,4 +21,9 @@ public struct ThenReturnValue<IN, OUT> {
public func thenReturn(output: OUT) {
setOutput { _ in .ReturnValue(output) }
}
/// Invoke real implementation when invoked.
public func thenCallRealImplementation() {
setOutput { _ in .CallRealImplementation }
}
}

View File

@ -7,7 +7,7 @@
//
public struct ThenReturnValueOrThrow<IN, OUT> {
let setOutput: (Any -> ReturnValueOrError) -> Void
let setOutput: (Any -> OnStubCall) -> Void
/// Invoke `implementation` when invoked.
public func then(implementation: IN throws -> OUT) {
@ -16,7 +16,7 @@ public struct ThenReturnValueOrThrow<IN, OUT> {
do {
return try .ReturnValue(implementation(parameters))
} catch let error {
return .Error(error)
return .ThrowError(error)
}
}
}
@ -28,6 +28,11 @@ public struct ThenReturnValueOrThrow<IN, OUT> {
/// Throw `error` when invoked.
public func thenThrow(error: ErrorType) {
setOutput { _ in .Error(error) }
setOutput { _ in .ThrowError(error) }
}
/// Invoke real implementation when invoked.
public func thenCallRealImplementation() {
setOutput { _ in .CallRealImplementation }
}
}

View File

@ -12,7 +12,7 @@ public struct ToBeStubbedFunction<IN, OUT> {
let name: String
let parameterMatchers: [AnyMatcher<IN>]
func setOutput(output: Any -> ReturnValueOrError) {
func setOutput(output: Any -> OnStubCall) {
handler.createStubReturningValue(name, parameterMatchers: parameterMatchers, output: output)
}
}

View File

@ -12,7 +12,7 @@ public struct ToBeStubbedThrowingFunction<IN, OUT> {
let name: String
let parameterMatchers: [AnyMatcher<IN>]
func setOutput(output: Any -> ReturnValueOrError) {
func setOutput(output: Any -> OnStubCall) {
handler.createStubReturningValue(name, parameterMatchers: parameterMatchers, output: output)
}
}