2017-03-13 2 views
3

스위프트로 swift package init --type executable을 통해 실행 파일을 생성 했으므로 몇 가지 테스트를 작성하고 싶습니다. 이 경우 라이브러리 패키지에서 전혀 문제가되지 않는 것으로 보입니다.이 경우 Swift는 을 통해 원활하게 실행되는 테스트 모듈로 Tests 디렉토리를 채 웁니다. 실행 파일의 경우 비어있는 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

하다니 실행 파일을 테스트 할 수 없다는 정확한 해결책이 아니기 때문에 해결 방법을 알게되었습니다. 기본적인 아이디어는 어느 정도는 모든 프로젝트를 동일한 프로젝트 내에서 두 번째 모듈로 옮기고 실행 가능 타겟을 엔트리 함수 호출로 최소화하는 것입니다.

과 같을 것이다 주어진 예를 들어 다음과 같은 기본 구조 : 이것은 필요하게

. 
├── 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

관련 문제