2017-03-13 26 views
3

Swiftで実行可能ファイルを作成しました。swift package init --type executableで、いくつかのテストを書いてみたいと思います。この場合、ライブラリパッケージにはまったく問題はないようです。その場合、Testsディレクトリには、swift testでうまく動作するテストモジュールが置かれます。実行可能ファイルの場合は、空のTestsディレクトリのみが作成されます。Swiftで実行可能ファイルをテスト

Xcodeまたはswift testから実行ファイルのテストを実行しようとしていますが、Swiftがmain.swiftの内容をテストにリンクできないことを指定しているようですが、リンカーの問題が発生しています。私はここで何ができるのか分かりません。私はリンクする新しいフレームワークターゲットを作成するためにXcodeの中で試してみましたが、それでも私が知る限り、swift testによって取り上げられるものはありません。私はそれをXcode経由でも動作させることはできませんでした。以下は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 

これは参考のために私のファイルの内容です。これは最小限のサンプルプロジェクトです。

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()) 
    } 
} 

ディレクトリレイアウト

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

答えて

2

ながら、実行可能ファイルをテストできないという厳密な解決策ではなく、私は回避策を認識しました。基本的な考え方は、多かれ少なかれ、同じプロジェクト内の2番目のモジュールに移動し、実行可能なターゲットを最小化してエントリ関数を呼び出すことです。

次のようになり与えられた例を、以下の基本的な構造:これは、それが必要になり

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

しかしPackage.swiftにターゲットを指定します。

import PackageDescription 

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

あなたは私の一日を保存しました!どうもありがとうございます :) – pushkarnk

関連する問題