Load files in xcode unit tests

前端 未结 7 1888
失恋的感觉
失恋的感觉 2021-02-02 05:17

I have an Xcode 5 unit test project and some test xml files related to it. I\'ve tried a bunch of approaches but I can\'t seem to load the xml files.

I\'ve tried the fol

相关标签:
7条回答
  • 2021-02-02 05:40

    With swift Swift 3 the syntax self.dynamicType has been deprecated, use this instead

    let testBundle = Bundle(for: type(of: self))
    guard let ressourceURL = testBundle.url(forResource: "TestData", ofType: "xml") else {
        // file does not exist
        return
    }
    do {
        let ressourceData = try Data(contentsOf: ressourceURL)
    } catch let error {
        // some error occurred when reading the file
    }
    

    or

    guard let ressourceURL = testBundle.url(forResource: "TestData", withExtension: "xml")
    
    0 讨论(0)
  • 2021-02-02 05:41
    1. Get main bundle
    2. Use main bundle to get local mock data
    3. Load data from JSON

    let mainBundle = Bundle(identifier: "com.mainBundle.Identifier")

    if let path = mainBundle?.path(forResource: "mockData", ofType: "json") {
            do {
                let testData = try Data(contentsOf: URL(fileURLWithPath: path))
                networkTestSession.data = testData
            } catch {
                debugPrint("local json test data missing")
            }
        }
    
    0 讨论(0)
  • 2021-02-02 05:45

    I know this specific question is asking for xml files, but if you're trying to do the same with json files, try this:

    let url = Bundle.main.url(forResource: "data", withExtension: ".json") guard let dataURL = url, let data = try? Data(contentsOf: dataURL) else { fatalError("Couldn't read data.json file") }

    0 讨论(0)
  • 2021-02-02 05:47

    When running tests the application bundle is still the main bundle. You need to use unit tests bundle.

    Objective C:

    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSString *path = [bundle pathForResource:@"TestData" ofType:@"xml"];
    NSData *xmlData = [NSData dataWithContentsOfFile:path];
    

    Swift 2:

    let bundle = NSBundle(forClass: self.dynamicType)
    let path = bundle.pathForResource("TestData", ofType: "xml")!
    let xmlData = NSData(contentsOfFile: path)
    

    Swift 3 and up:

    let bundle = Bundle(for: type(of: self))
    let path = bundle.path(forResource: "TestData", ofType: "xml")!
    let xmlData = NSData(contentsOfFile: path) 
    
    0 讨论(0)
  • 2021-02-02 05:58

    One thing to note is(It waste me serval minutes to figure it out):

    Don't forget to add the test file to "Copy Bundle Resources" section of Build Phases

    Without it, you couldn't load the file successfully.

    0 讨论(0)
  • 2021-02-02 06:00

    Relative paths are relative to the current working directory. By default, that's / — the root directory. It's looking for that folder at the root level of your startup disk.

    The correct way to get a resource that's within your bundle is to ask your bundle for it.

    In an application, you'd get the bundle using [NSBundle mainBundle]. I don't know if that works in a test case; try it, and if it doesn't (if it returns nil or an unuseful bundle object), substitute [NSBundle bundleForClass:[self class]].

    Either way, once you have the bundle, you can ask it for the path or URL for a resource. You generally should go for URLs unless you have a very specific reason to need a path (like passing it to a command-line tool using NSTask). Send the bundle a URLForResource:withExtension: message to get the resource's URL.

    Then, for the purpose of reading a string from it, use [NSString stringWithContentsOfURL:encoding:error:], passing the URL you got from the bundle.

    0 讨论(0)
提交回复
热议问题