2017-03-13 4 views
3

Ich erstellte eine ausführbare Datei mit Swift über und möchte jetzt ein paar Tests dafür schreiben. Dies scheint bei Bibliothekspaketen überhaupt kein Problem zu sein, in diesem Fall füllt Swift auch das Verzeichnis Tests mit einem Testmodul, das gut über swift test läuft. Für eine ausführbare Datei wird nur ein leeres Verzeichnis Tests erstellt.Testen einer ausführbaren Datei mit Swift

Beim Versuch, Tests für meine ausführbare Datei aus Xcode oder über swift test auszuführen, stoße ich auf Linkerprobleme, die anscheinend angeben, dass Swift den Inhalt meines main.swift nicht mit den Tests verknüpfen kann. Ich bin mir nicht sicher, was ich hier machen kann. Ich habe versucht, in Xcode herumzuspielen, um neue Rahmenziele zu erstellen, die verlinkt werden sollen, aber nichts davon würde von swift test übernommen werden, soweit ich das beurteilen kann. Ich habe es auch nicht über Xcode geschafft. Das Folgende ist die Ausgabe von swift test.

Compile Swift Module 'swifttest' (1 sources) 
Linking ./.build/debug/swifttest 
Compile Swift Module 'swifttestTests' (1 sources) 
Linking ./.build/debug/swifttestPackageTests.xctest/Contents/MacOS/swifttestPackageTests 
Undefined symbols for architecture x86_64: 
    "__TF9swifttest3fooFT_SS", referenced from: 
     __TFFC14swifttestTests14SwifttestTests7testFooFT_T_u0_KzT_SS in swifttestTests.swift.o 
ld: symbol(s) not found for architecture x86_64 
<unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) 
<unknown>:0: error: build had 1 command failures 
error: exit(1): /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/kilian/Desktop/swifttest/.build/debug.yaml test 

Dies sind die Inhalte meiner Dateien als Referenz. Es ist ein minimales Beispielprojekt.

main.swift

public func foo() -> String { 
    return "bar" 
} 

print(foo()) 

swifttestTests.swift

import Foundation 
import XCTest 
import swifttest 

class SwifttestTests: XCTestCase { 
    func testFoo() { 
     XCTAssertEqual("bar", foo()) 
    } 
} 

Verzeichnislayout

. 
├── Package.swift 
├── Sources 
│   └── main.swift 
└── Tests 
    └── swifttestTests 
     └── swifttestTests.swift 

Antwort

2

Während Nicht gerade eine Lösung, um eine ausführbare Datei nicht testen zu können. Ich wurde auf einen Workaround aufmerksam gemacht. Die Grundidee besteht darin, mehr oder weniger alles in ein zweites Modul innerhalb desselben Projekts zu verschieben und das ausführbare Ziel auf einen Aufruf einer Einstiegsfunktion zu minimieren.

Eine Grundstruktur dem gegebenen Beispiel folgende würde wie folgt aussehen:

. 
├── Package.swift 
├── Sources 
│ └── swifttest 
│ │ └── main.swift 
│ └── SwiftTestLib 
│  └── foo.swift 
└── Tests 
    └── SwiftTestLibTests 
     └── SwiftTestLibTests.swift 

jedoch die Ziele in der Package.swift angeben es notwendig Dies macht.

import PackageDescription 

let package = Package(
    name: "swifttest", 
    targets: [ 
    Target(name: "swifttest", dependencies: ["SwiftTestLib"]), 
    Target(name: "SwiftTestLib", dependencies: []), 
    ], 
    dependencies: [] 
) 
+0

Sie haben meinen Tag gerettet! Ich danke dir sehr :) – pushkarnk

Verwandte Themen