Swift на стороне сервера: тестирование кода, использующего пакет
Я использую серверный Swift и занимаюсь разработкой в Xcode после выполнения:
swift package generate-xcodeproj
У меня есть класс, который использует Bundle
(ранее NSBundle
) загрузить в файл.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/Developer/Library/Xcode/Agents/Test.plist
что не очень полезно.
Одна вещь, которую я заметил, это то, что на вкладке General нет опций "Host Application:".
Мысли?
1 ответ
Я не смог полностью ответить на это, но придумал обходной путь для моей ситуации. Я использую класс 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://stackru.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 для полного контекста.