在xcode单元测试中加载文件

Ard*_*Dev 56 xcode unit-testing nsbundle

我有一个Xcode 5单元测试项目和一些与之相关的测试xml文件.我尝试了一堆方法,但我似乎无法加载xml文件.

我尝试过以下哪些不起作用

NSData* nsData = [NSData dataWithContentsOfFile:@"TestResource/TestData.xml"];

NSString* fileString = [NSString stringWithContentsOfFile:@"TestData.xml" encoding:NSUTF8StringEncoding error:&error];
Run Code Online (Sandbox Code Playgroud)

此外,如果我尝试使用[NSBundle allBundles]预览所有捆绑包,单元测试包不会出现在列表中?

我试图创建一个单独的资源包,我似乎无法以编程方式找到它,尽管它确实已经构建和部署.

我究竟做错了什么 ?

sas*_*ash 95

运行测试时,应用程序包仍然是主要的捆绑包.您需要使用单元测试包.

目标C:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *path = [bundle pathForResource:@"TestData" ofType:@"xml"];
NSData *xmlData = [NSData dataWithContentsOfFile:path];
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

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

斯威夫特3:

let bundle = Bundle(for: type(of: self))
let path = bundle.path(forResource: "TestData", ofType: "xml")!
let xmlData = NSData(contentsOfFile: path) 
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用,谢谢你的腰带 (2认同)
  • 保持最新状态 (2认同)
  • `捆绑(用于:Self.self)` (2认同)

Mar*_*Him 10

使用swift Swift 3语法self.dynamicType已被弃用,请改用它

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
}
Run Code Online (Sandbox Code Playgroud)

要么

guard let ressourceURL = testBundle.url(forResource: "TestData", withExtension: "xml")
Run Code Online (Sandbox Code Playgroud)


ste*_*mit 7

答案所述:

当单元测试工具运行代码时,单元测试包不是主要包.即使您正在运行测试,而不是您的应用程序,您的应用程序包仍然是主要的捆绑包.

如果您使用以下代码,那么您的代码将搜索您的单元测试类所在的包,一切都会好的.

目标C:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *path = [bundle pathForResource:@"TestData" ofType:@"xml"];
NSData *xmlData = [NSData dataWithContentsOfFile:path];
Run Code Online (Sandbox Code Playgroud)

迅速:

let bundle = NSBundle(forClass: self.dynamicType)
if let path = bundle.pathForResource("TestData", ofType: "xml")
{
    let xmlData = NSData(contentsOfFile: path)
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*sey 2

相对路径是相对于当前工作目录的。默认情况下,/\xe2\x80\x94 是根目录。它正在启动磁盘的根级别寻找该文件夹。

\n\n

获取捆绑包中的资源的正确方法是向捆绑包索要它。

\n\n

在应用程序中,您可以使用 来获取捆绑包[NSBundle mainBundle]。我不知道这在测试用例中是否有效;尝试一下,如果没有(如果它返回nil或一个无用的捆绑对象),则替换[NSBundle bundleForClass:[self class]].

\n\n

无论哪种方式,一旦您获得了捆绑包,您就可以向其询问资源的路径或 URL。通常,您应该使用 URL,除非您有非常具体的原因需要路径(例如使用 NSTask 将其传递给命令行工具)。向捆绑包发送一条URLForResource:withExtension:消息以获取资源的 URL。

\n\n

然后,为了从中读取字符串,请使用[NSString stringWithContentsOfURL:encoding:error:],传递从包中获取的 URL。

\n