IT TIP

xcode 단위 테스트에서 파일로드

itqueen 2020. 12. 29. 08:12
반응형

xcode 단위 테스트에서 파일로드


Xcode 5 단위 테스트 프로젝트와 이와 관련된 일부 테스트 xml 파일이 있습니다. 나는 많은 접근법을 시도했지만 xml 파일을로드 할 수없는 것 같습니다.

작동하지 않는 다음을 시도했습니다.

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

NSString* fileString = [NSString stringWithContentsOfFile:@"TestData.xml" encoding:NSUTF8StringEncoding error:&error];

또한 [NSBundle allBundles]를 사용하여 모든 번들을 미리 보려고하면 단위 테스트 번들이 목록에 나타나지 않습니까?

별도의 리소스 번들을 만들려고했지만 빌드 및 배포되었지만 프로그래밍 방식으로 찾을 수없는 것 같습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까 ?


테스트를 실행할 때 애플리케이션 번들은 여전히 ​​기본 번들입니다. 단위 테스트 번들을 사용해야합니다.

목표 C :

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

스위프트 2 :

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

스위프트 3 :

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

신속한 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
}

또는

guard let ressourceURL = testBundle.url(forResource: "TestData", withExtension: "xml")

답변 에서 언급했듯이 :

단위 테스트 도구가 코드를 실행할 때 단위 테스트 번들은 기본 번들 아닙니다 . 애플리케이션이 아닌 테스트를 실행하더라도 애플리케이션 번들은 여전히 ​​기본 번들입니다.

다음 코드를 사용하면 코드가 단위 테스트 클래스가있는 번들을 검색하고 모든 것이 정상입니다.

목표 C :

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

빠른:

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

상대 경로는 현재 작업 디렉토리에 상대적입니다. 기본적으로 / — 루트 디렉토리입니다. 시동 디스크의 루트 수준에서 해당 폴더를 찾고 있습니다.

번들에있는 리소스를 가져 오는 올바른 방법은 번들에 요청하는 것입니다.

응용 프로그램에서 [NSBundle mainBundle]. 테스트 케이스에서 작동하는지 모르겠습니다. 시도해보고 그렇지 않으면 (반환 nil되거나 쓸모없는 번들 객체 인 경우) [NSBundle bundleForClass:[self class]].

어느 쪽이든 번들이 있으면 리소스의 경로 또는 URL을 요청할 수 있습니다. 경로가 필요한 특별한 이유가없는 한 일반적으로 URL을 찾아야합니다 (예 : NSTask를 사용하여 명령 줄 도구에 전달). URLForResource:withExtension:리소스의 URL을 가져 오려면 번들에 메시지를 보냅니다.

그런 다음 문자열을 읽을 목적으로 [NSString stringWithContentsOfURL:encoding:error:]번들에서 가져온 URL을 전달하여을 사용하십시오.

참조 URL : https://stackoverflow.com/questions/19151420/load-files-in-xcode-unit-tests

반응형