Сбой быстрого теста с исполняемым файлом, но не с библиотекой?

Я разрабатываю некоторый серверный код в Swift на своем Mac, но для возможного развертывания в Linux. Я создал свою структуру проекта с помощью диспетчера пакетов Swift. Я создал пару модульных тестов XCTestCase для классов. Однако я заметил, что если я устанавливаю для своего целевого продукта значение .executable, при запуске swift test я получаю вывод, похожий на:

Компилировать модуль Swift «MyProjUtilTests» (3 источника) Связывание ./.build/x86_64-apple-macosx10.10/debug/MyProjUtilPackageTests.xctest/Contents/MacOS/MyProjUtilPackageTests Неопределенные символы для архитектуры x86_64:
«__T012MyProjUtil16PropertyListUtilC : __T017MyProjUtilTests20PropertyListUtilTestC16testReadFromFileyyF in PropertyListUtilTest.swift.o "__T012MyProjUtil3FooCMa", referenced from: __T017MyProjUtilTests03FooC0C07testRunD0yyFSSyKXKfu_ in FooTests.swift.o "__T012MyProjUtilAAVABycfC", referenced from: __T017MyProjUtilTestsAAC11testExampleyyFSSyKXKfu_ in MyProjUtilTests.swift.o ld: symbol(s) not found for architecture x86_64 :0: ошибка: команда ссылки не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов) ошибка: завершено (1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Volumes/Без названия/SwiftDev/MyProj/MyProjUtil/.build/debug.yaml test

Однако, если я изменю свой целевой продукт на .library и запущу swift test, он выполнит мои тесты и завершится без ошибки. Это ошибка в диспетчере пакетов Swift? Нужно ли мне делать что-то еще, чтобы включить модульные тесты в мой исполняемый продукт? Или это ожидаемое поведение? Может ли кто-нибудь пролить свет на то, что я вижу здесь и почему? Спасибо!!


person Shadowman    schedule 20.03.2018    source источник


Ответы (1)


Да, это ожидаемое поведение.

Вы можете сделать три цели в своем Package.swift. «MyAppLibTests», «MyAppLib» и «MyAppExec».

«MyAppLibTests» зависит от «MyAppLib». «MyAppExec» также зависит от «MyAppLib». И «MyAppLib» зависит от любых внешних зависимостей, которые у вас могут быть.

Ваша структура каталогов может выглядеть так:

+-- Package.swift
|
+-- Sources/
| |
| +-- MyAppLib/
| |     ...files...
| |
| +-- MyAppLibExec/
|   |
|   +-- main.swift
|
+-- Tests/
  |
  +-- MyAppLibTests/
    |
    +-- MyTestCase.swift

И затем в вашем main.swift вы бы import MyAppLib; import Foundation а затем, возможно, проанализировали аргументы командной строки и переменные среды. Передайте параметры в основную точку входа вашей библиотеки. Что-то вроде MyAppMain().run(option: parsedValue, option2: parsedValue2)

Бонус: чтобы получить аргумент командной строки, они находятся в массиве строк: Commandline.arguments. Чтобы получить переменные среды, они находятся в словаре строк в строки: ProcessInfo.processInfo.environment["SOME_ENV_VAR"]

person Daniel R    schedule 22.08.2018