2013-10-03 1 views
40

У меня есть тестовый проект xCode5 и некоторые тестовые XML-файлы, связанные с ним. Я пробовал кучу подходов, но я не могу загрузить файлы xml.Загрузите файлы в модульные тесты xcode

Я попытался следующий, не работает

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

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

Кроме того, если я стараюсь, чтобы просмотреть все пучки, используя [NSBundle allBundles] блок тест расслоение не отображается в списке?

Я попытался создать отдельный пакет ресурсов, и я не могу найти его программным путем, хотя он и будет создан и развернут.

Что я делаю неправильно?

+0

Эй, где вы сохранили файл для его доступа по маршруту «TestResource/TestData.xml»? – Bhargav

ответ

2

Относительные пути относятся к текущему рабочему каталогу. По умолчанию это/- корневой каталог. Он ищет эту папку на корневом уровне вашего загрузочного диска.

Правильный способ получить ресурс, который находится в вашем пакете, - это расспросить об этом свой пакет.

В приложении вы получите комплект, используя [NSBundle mainBundle]. Я не знаю, работает ли это в тестовом примере; попробуйте, а если нет (если он вернет nil или неиспользуемый объект связки), замените [NSBundle bundleForClass:[self class]].

В любом случае, если у вас есть комплект, вы можете задать ему путь или URL-адрес ресурса. Обычно вы должны указывать URL-адреса, если у вас нет особых причин для использования пути (например, передача его в инструмент командной строки с использованием NSTask). Отправьте комплект URLForResource:withExtension:, чтобы получить URL ресурса.

Затем, чтобы прочитать строку из нее, используйте [NSString stringWithContentsOfURL:encoding:error:], передав URL-адрес, полученный из пакета.

+1

Итак, я узнал, что загрузка пакета с использованием его идентификатора сработала. Хотя этот идентификатор не является частью массива в [NSBundle allBundles]. В идеале он должен перечислить его ... – ArdenDev

69

При выполнении тестов комплект приложений по-прежнему остается основным комплектом. Вам нужно использовать комплектные тесты.

цель 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:

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

, который тоже работал для меня, спасибо, створка – leopic

+0

Это действительно работает для меня Спасибо !!! – durgeshtrivedi

+0

Хорошо обновленный –

6

Как указано в этом answer:

При тестировании жгута проводов вашего кода ваш комплект для тестирования устройства составляет NOT основной комплект. Несмотря на то, что вы используете тесты, а не ваше приложение, ваш пакет приложений по-прежнему является основным пакетом.

Если вы используете следующий код, то ваш код будет искать в комплекте, в котором находится ваш тестовый класс, и все будет хорошо.

цель 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) 
} 
+1

В примере Swift, я думаю, вы хотите иметь «связку» вместо «testBundle» на второй строке. – colbadhombre

+0

Спасибо! Исправлена. –

+0

Этот ответ в основном такой же, как и за год до него. – mac10688

6

С быстрым 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")