I am adding tests using swift-testing to a parser library and would like to access files.
What is the recommended way to do that ? Is using the SwiftPM Resource.copy then Bundle.module.path(...) facility the way to go ?
I am adding tests using swift-testing to a parser library and would like to access files.
What is the recommended way to do that ? Is using the SwiftPM Resource.copy then Bundle.module.path(...) facility the way to go ?
Hi @mlienert, yes, when writing tests in a Swift package, I'd recommend that approach to access files as resources in the test target. Or you can use Bundle.module.url(forResource: ...), but the general idea is to ask for the location from Bundle.module.
Thank you for your feedback !
Does anyone know how I'd do this for an app developed in Xcode? Bundle.module.load gives the error Type 'Bundle' has no member 'module' for me.
The Bundle.module accessor is a SwiftPM feature: SwiftPM generates this accessor for targets that have a non-empty resources: argument in their target definition.
Because it's a SwiftPM feature, Bundle.module is not available for targets defined in an Xcode project. For a typical app test target defined in an Xcode project, you can probably use the Bundle(for class: AnyClass) initializer, passing in some class in your target that's visible to Objective-C. (I forget whether Bundle.main in an app unit test target will return the bundle for the tests or the main app bundle.)
If you're talking about a test target defined via SwiftPM (i.e. in a Package.swift file), Bundle.module should work even when you run the tests in Xcode (provided the test target has any resources defined).
Something we probably ought to do with our is to add a Bundle instance that points at the test target explicitly. Something like:
extension Bundle {
public static var testContent: Self { get }
}
We can't do that today because it creates a cyclical dependency between Foundation and Swift Testing (sad trombone) but we're looking at setting up what Swift calls a "cross-import overlay": a tertiary module with its own dependency graph that's automatically imported if you import two other modules (in this case, Testing and Foundation.)
Thanks, I was able to use the traditional Bundle(for: TestClass.self) where TestClass is an @Suite with swift-testing to get something working.