テストのように、私はSwiftクラスを他のファイルからインクルードしたいだけです。
PrimeNumberModel.Swift
import Foundation
class PrimeNumberModel { }
PrimeNumberModelTests.Swift
import XCTest
import PrimeNumberModel // gives me "No such module 'PrimeNumberModel'"
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel() // "Use of unresolved identifier 'PrimeNumberModel'"
}
両方のSwiftファイルは同じディレクトリにあります。
XCTestCase
ファイルにも同じ問題がありましたが、通常のプロジェクトファイルにはありませんでした。
を取り除くために:
未解決の識別子 'PrimeNumberModel'の使用
テストファイルでベースモジュールをimport
する必要がありました。私の場合、私のターゲットは 'myproject'と呼ばれ、私はimport myproject
を追加してクラスを認識しました。
これで、テストするためにpublic
をメソッドに追加する必要がなくなりました。 Swiftの新しいバージョンでは、 @testable
キーワードを追加するだけです。
PrimeNumberModelTests.Swift
import XCTest
@testable import MyProject
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel()
}
また、内部メソッドはInternal
を保持できます
PrimeNumberModel.Swift
import Foundation
class PrimeNumberModel {
init() {
}
}
private
(およびfileprivate
)シンボルは、@testable
を使用しても使用できないことに注意してください。
ここにSwiftから2つの関連する概念があります(Xcode 6ベータ6として)。
Internal access
テストがPrimeNumberModelTests.Swift
の別のターゲットにあることを考慮すると、targetがimport
と呼ばれる場合、テストするクラスを含むターゲットをMyProject
する必要がありますimport MyProject
をPrimeNumberModelTests
に:
PrimeNumberModelTests.Swift
import XCTest
import MyProject
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel()
}
ただし、これはクラスPrimeNumberModel
をテストするには十分ではありません。デフォルトのアクセス制御レベルはInternal Access
であるため、クラスはテストバンドルに表示されないため、Public Access
および必要なすべてのメソッドを作成する必要がありますテストする:
PrimeNumberModel.Swift
import Foundation
public class PrimeNumberModel {
public init() {
}
}
テストターゲットでPrimeNumberModel.Swiftのtarget-membershipを確認してください。
Objective-Cでは、クラスを別のファイルで使用したい場合は、それをインポートする必要がありました。
#import "SomeClass.h"
しかし、Swiftでは、インポートする必要はまったくありません。インポート済みのように使用してください。
// This is a file named SomeClass.Swift
class SomeClass : NSObject {
}
// This is a different file, named OtherClass.Swift
class OtherClass : NSObject {
let object = SomeClass()
}
ご覧のとおり、インポートは必要ありませんでした。お役に立てれば。
Appleによれば、同じターゲットにSwiftファイルをインポートする必要はありません。 Swiftファイルを通常のターゲットとテストターゲットの両方に追加することで、ようやく機能するようになりました。次に、テスト用のブリッジヘッダーを使用して、通常のブリッジヘッダーで参照しているObjCファイルが使用可能かどうかを確認しました。今魅力のように走った。
import XCTest
//Optionally you can import the whole Objc Module by doing #import ModuleName
class HHASettings_Tests: XCTestCase {
override func setUp() {
let x : SettingsTableViewController = SettingsTableViewController()
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
XCTAssert(true, "Pass")
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock() {
// Put the code you want to measure the time of here.
}
}
}
そのため、PrimeNumberModelにテストターゲットのターゲットがあることを確認してください。またはあなたのモジュール全体をインポートするHigh6の解決策はうまくいくでしょう。
私は自分の作品をきれいにすることでこの問題を解決することができました。
トップメニュー - >製品情報 - >クリーンまたはキーボードショートカット: Shift+Cmd+K
Swift 2.0では、ベストプラクティスは次のとおりです。
テストファイルの先頭に@testable import MyApp
という行を追加します。ここで、 "MyApp"はアプリケーションターゲットの製品モジュール名です(アプリケーションターゲットので表示可能) )設定を構築します。それでおしまい。
(アプリケーションターゲットの名前にスペースが含まれていない限り、製品モジュールの名前はアプリケーションターゲットの名前と同じになります。スペースはアンダースコアに置き換えられます。 「テストの先頭に@testable import Fun_Game
を書きます。)
PrimeNumberModelTests
のターゲット設定を確認してください。
Build PrimeNumberModel.Swift
でPhases/Compile Sources
ファイルが見えない場合は、それを追加してください。
コンパイラがエントリポイントとして参照するためのルーチンを追加する必要があるので、main.Swiftファイルを追加します。この場合は、単にテストファイルのインスタンスを作成します。
main.Swift
PrimeNumberModelTests()
次にコマンドラインでコンパイルします(私はEl CapitanとSwift 2.2を使用しています)。
xcrun -sdk macosx swiftc -emit-executable -o PrimeNumberMain PrimeNumberModel.Swift PrimeNumberModelTests.Swift main.Swift
この場合、次のような警告が表示されます。イニシャライザの結果は未使用ですが、プログラムはコンパイルされ実行可能です。
./PrimeNumberMain
警告:簡単のため、インポートXCTestおよびXCTestCaseタイプを削除しました。
@ high6と@ erik-p-hansenが@ high6の回答で指摘しているように、これはPrimeNumberModelクラスがあるモジュールのターゲットをインポートすることで解決できます。これはおそらく単純なプロジェクトのプロジェクトと同じ名前です。 。
これを見ている間に、私はClayton McIlrathによるswiftcast.tvの上の記事 であなたの最初の単体テストをSwift で書いてみました。アクセス修飾子について説明し、モデルファイルではなくViewControllerの場合と同じ問題の例を示し、ターゲットにインポート先ファイルを含めることでターゲットをインポートする方法とアクセス修飾子の問題を解決する方法の両方を示します。実際にテストしない限り、テストしようとしているクラスをパブリックにする必要はありません。
だから、あなたがする必要があります
私の場合は、単体テストしたいSwiftファイルがあり、その単体テストファイルもSwiftクラスでした。アクセス修飾子が正しいことを確認しましたが、ステートメント
import stMobile
(stMobileが私たちのターゲットネームであるとしましょう)
まだ動作しませんでした(私はまだ 'そのようなモジュールがありません'というエラーが出ていました)、私はターゲットをチェックしました、そしてその名前は確かにstMobileでした。それで、私はパッケージの下のBuild Settingsに行き、Product Module Nameを見つけました、そして、なぜかこれはSt_Mobileと呼ばれたので、私は私のimportステートメントを変更しました
import St_Mobile
(これは製品モジュール名です)、そしてすべてうまくいきました。
要約すると、
製品モジュール名を確認して、単体テストクラスで下記のimport文を使用してください。
import myProductModuleName
アクセス修飾子が正しいことを確認してください(クラスレベルとメソッド)。
明示的なインポートを要求する代わりに、Swiftコンパイラは依存関係のあるSwiftライブラリの.swiftmodule
ファイルを暗黙的に検索します。
XcodeはあなたのためにSwiftモジュールを構築することができます、あるいはswiftc
のためのコマンドライン指示については railswareブログ を参照してください。