diff --git a/Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionReturnBuilder.swift b/Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionReturnBuilder.swift index 7cc32060..59031f45 100644 --- a/Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionReturnBuilder.swift +++ b/Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionReturnBuilder.swift @@ -65,6 +65,22 @@ public struct ThrowingFunctionReturnBuilder< mocker.addReturnValue(.produce(producer), for: member) return .init(mocker: mocker) } + + /// Registers a result type that automatically emits a value when successful or throws a failure + /// + /// - Parameter result: The result type wrapping a value or error. + /// - Returns: The parent builder, used for chaining additional specifications. + @discardableResult + public func willHandleResult(_ result: Result) -> ParentBuilder { + switch result { + + case let .success(value): + mocker.addReturnValue(.return(value), for: member) + case let .failure(error): + mocker.addReturnValue(.throw(error), for: member) + } + return .init(mocker: mocker) + } } extension ThrowingFunctionReturnBuilder where ReturnType == Void { diff --git a/Tests/MockableTests/GivenTests.swift b/Tests/MockableTests/GivenTests.swift index b0c652bd..4ba393e4 100644 --- a/Tests/MockableTests/GivenTests.swift +++ b/Tests/MockableTests/GivenTests.swift @@ -277,6 +277,30 @@ final class GivenTests: XCTestCase { XCTAssertEqual(user.age, 100) } + func test_givenResult_willEmitSuccess() throws { + let expected = User.test1 + let result: Result = .success(expected) + + given(mock) + .getUser(for: .any) + .willHandleResult(result) + + let actual = try mock.getUser(for: .init()) + + XCTAssertEqual(actual, expected) + } + + func test_givenResult_willThrow() throws { + let expected = UserError.notFound + let result: Result = .failure(expected) + + given(mock) + .getUser(for: .any) + .willHandleResult(result) + + XCTAssertThrowsError(try mock.getUser(for: .init())) + } + @MainActor func test_givenConcurrentGivens_whenCalled_synchronizedCorrectly() async throws { // Register return values concurrently