# Using #require to unwrap an optional fails to compile

**URL:** <https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355>\
**Category:** Swift Testing\
**Tags:** testing, help-needed, swift-testing\
**Created:** [July 22, 2024, 1:23pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355 "2024-07-22T13:23:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![JacobHearst](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/jacobhearst/32/31923_2.png) [@JacobHearst](https://forums.swift.org/u/JacobHearst)\
**Post date:** [July 22, 2024, 1:23pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355/1 "2024-07-22T13:23:24Z")

</div>

Hi all, I'm trying to to write some tests using the new `swift-testing` library and am running into an issue with using `#require` to unwrap optionals. Here's my test:

```swift
import FluentKit
import NIOEmbedded
import Testing
import XCTFluent

@Suite
struct CreateObjectTests {
    @Test func testCreateObject() async throws {
        // Given
        var mockDB = DummyDatabase()
        mockDB.context = .init(
            configuration: DummyDatabaseConfiguration(middleware: []),
            logger: .init(label: "codes.vapor.test"),
            eventLoop: EmbeddedEventLoop(),
            history: QueryHistory()
        )

        // When
        // Create the object...

        // Then
        let queries = #require(mockDB.history?.queries)

        #expect(queries.count == 1)
        let onlyQuery = #require(queries.first)

        print(onlyQuery.input)
    }
}

```

Based on what I know, this _seems_ like a valid usage of [this `#require` overload](https://swiftpackageindex.com/apple/swift-testing/main/documentation/testing/require(_:_:sourcelocation:)-6w9oo). Am I missing or misunderstanding something?

 ![image](https://global.discourse-cdn.com/swift/original/3X/2/d/2d2ab5e08b753a9b7815874f2a056f52ff3e453d.png)

---

<div class="post-metadata">

**Author:** ![Matejkob](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/matejkob/32/34399_2.png) [@Matejkob](https://forums.swift.org/u/Matejkob)\
**Post date:** [July 22, 2024, 1:48pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355/2 "2024-07-22T13:48:36Z")

</div>

I think I might have spotted a small oversight in your code. It seems like you're just missing the `try` keyword before your `#require` macros. I belive your code should look something like this:

```diff
-let queries = #require(mockDB.history?.queries)
+let queries = try #require(mockDB.history?.queries)

#expect(queries.count == 1)
-let onlyQuery = #require(queries.first)
+let onlyQuery = try #require(queries.first)

```

---

<div class="post-metadata">

**Author:** ![JacobHearst](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/jacobhearst/32/31923_2.png) [@JacobHearst](https://forums.swift.org/u/JacobHearst)\
**Post date:** [July 22, 2024, 2:05pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355/3 "2024-07-22T14:05:56Z")

</div>

Ah, thank you! I was expecting the macro to handle that all for me but this makes sense.

---

<div class="post-metadata">

**Author:** ![grynspan](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/grynspan/32/15315_2.png) [@grynspan](https://forums.swift.org/u/grynspan)\
**Post date:** [July 22, 2024, 2:37pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355/4 "2024-07-22T14:37:30Z")

</div>

Our documentation _should_ consistently show `try` before `#require()`. If any of our documentation is missing `try`, please let us know so we can fix it.

---

<div class="post-metadata">

**Author:** ![xAlien95](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/xalien95/32/12558_2.png) [@xAlien95](https://forums.swift.org/u/xAlien95)\
**Post date:** [July 22, 2024, 2:45pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355/5 "2024-07-22T14:45:48Z")

</div>

> <https://github.com/apple/swift-testing/blob/2f253b0c00c23312beca857c50961fa2159e0f88/Sources/Testing/Expectations/Expectation%2BMacro.swift#L68-L72>

Should the macro declaration have `throws`?

---

<div class="post-metadata">

**Author:** ![grynspan](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/grynspan/32/15315_2.png) [@grynspan](https://forums.swift.org/u/grynspan)\
**Post date:** [July 22, 2024, 3:02pm UTC](https://forums.swift.org/t/using-require-to-unwrap-an-optional-fails-to-compile/73355/6 "2024-07-22T15:02:18Z")

</div>

Effect keywords are not valid on macro declarations, which is why you don't see any on the declarations for `#require()`. @Douglas_Gregor can provide more information.
