2016-12-27 6 views
0

Я использую на сторону сервера Swift, и делаю свое развитие в Xcode после выполнения:стороны сервера Swift: Тестирование код, который использует Bundle

swift package generate-xcodeproj 

У меня есть класс, который использует BundleNSBundle (ранее) к загрузите файл .plist для некоторых настроек на сервере. Он отлично работает при работе на самом сервере, но когда я создаю некоторые модульные тесты для этого класса, я не могу получить доступ к каталогу, в котором находится файл .plist. Соответствующий фрагмент кода:

let bundlePath = Bundle.main.bundlePath as NSString 
let plistPath = bundlePath.appendingPathComponent("Test.plist") 
plistDict = NSDictionary(contentsOfFile: plistPath) 

Когда я запускаю это в единичных XCTests, plistPath является:

/Applications/Xcode-8.2.app/Contents/Developer/Platforms/MacOSX.platform/ Разработчик/Библиотека/Xcode/Agents/Test.plist

, что не очень полезно.

Одна вещь, которую я заметил, заключается в том, что на вкладке «Общие» нет параметров «Host Application:».

Мысли?

ответ

0

Я не смог полностью ответить на это, но придумал обход для моей ситуации. Я использую класс Perfect File (см. https://github.com/PerfectlySoft/Perfect.git) и просто динамически создаю файл, который мне нужен для своих случаев XCTest в методе setUp(). К счастью, у меня довольно простые потребности в содержимом файла. Вот начальная часть моего XCTest файла:

import XCTest 
import SMServerLib 
import PerfectLib 

class TestPlistDictLoader: XCTestCase { 
    var plistFileName:String! = "TestPlistDictLoader.plist" 
    var pathName:String! = "/tmp" 

    override func setUp() { 
     super.setUp() 
     // A bit of a hack, but I can't figure out a way otherwise to access the install directory where the code is running. 
     // See also http://stackoverflow.com/questions/41340114/server-side-swift-testing-code-that-uses-bundle 
     // The only downside is that these tests don't test the `init(plistFileNameInBundle filename:String)` constructor that uses the Bundle. 
     // Write the .plist file to a known location. Use only pure Swift methods. 

     let plistPath = (pathName as NSString).appendingPathComponent(plistFileName) 
     let plist = File(plistPath) 
     try! plist.open(.write) 
     try! plist.write(string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
      "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" + 
      "<plist version=\"1.0\">\n" + 
      "<dict>\n" + 
       "<key>MyString</key>\n" + 
       "<string>Hello World!</string>\n" + 
       "<key>MyInteger</key>\n" + 
       "<integer>100</integer>\n" + 
      "</dict>\n" + 
      "</plist>\n" 
     ) 

     plist.close() 
    } 

См https://github.com/crspybits/SMServerLib для полного контекста.