Saya hanya ingin memasukkan kelas Swift saya dari file lain, seperti pengujiannya
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'"
}
Kedua file cepat berada di direktori yang sama.
Jawaban:
Saya memiliki masalah yang sama, juga dalam
XCTestCase
file saya , tetapi tidak dalam file proyek biasa.Untuk menghilangkan:
Saya perlu
import
modul dasar dalam file tes. Dalam kasus saya, target saya disebut 'myproject' dan saya menambahkanimport myproject
dan kelasnya dikenali.sumber
public
. Kalau tidak,XCTestCase
subclass tidak akan dapat "melihat" apa yang Anda coba untuk menguji. Saya menghabiskan beberapa jam pada malam terakhir ini :)import
pernyataanUPDATE Swift 2.x, 3.x, 4.x dan 5.x
Sekarang Anda tidak perlu menambahkan
public
metode untuk menguji itu. Pada versi Swift yang lebih baru, hanya perlu menambahkan@testable
kata kunci.PrimeNumberModelTests.swift
Dan metode internal Anda dapat dipertahankan
Internal
PrimeNumberModel.swift
Perhatikan bahwa
private
(danfileprivate
) simbol tidak tersedia bahkan dengan menggunakan@testable
.Swift 1.x
Ada dua konsep yang relevan dari Swift di sini (As Xcode 6 beta 6).
Internal access
Mempertimbangkan bahwa tes berada pada target lain pada
PrimeNumberModelTests.swift
Anda perluimport
target yang berisi kelas yang ingin Anda uji, jika target Anda dipanggilMyProject
perlu menambahkanimport MyProject
kePrimeNumberModelTests
:PrimeNumberModelTests.swift
Tetapi ini tidak cukup untuk menguji kelas Anda
PrimeNumberModel
, karena tingkat Kontrol Akses default adalahInternal Access
, kelas Anda tidak akan terlihat oleh bundel tes, jadi Anda perlu membuatnyaPublic Access
dan semua metode yang ingin Anda uji:PrimeNumberModel.swift
sumber
No such module <moduleName>
kesalahan kompilasi dalam kasus pengujian Anda, Anda mungkin ingin memeriksaPRODUCT_MODULE_NAME
target pengujian. Jawaban yang bagus Diogo.Dalam Dokumentasi dikatakan tidak ada pernyataan impor di Swift.
Cukup gunakan:
sumber
Periksa target-keanggotaan PrimeNumberModel.swift di target pengujian Anda.
sumber
Di Objective-C, jika Anda ingin menggunakan kelas di file lain, Anda harus mengimpornya:
Namun, di Swift, Anda tidak perlu mengimpor sama sekali. Cukup gunakan seolah-olah sudah diimpor.
Contoh
Seperti yang Anda lihat, tidak diperlukan impor. Semoga ini membantu.
sumber
Menurut Apple Anda tidak perlu mengimpor untuk file cepat di Target yang Sama. Saya akhirnya berhasil dengan menambahkan file cepat ke target reguler dan target pengujian saya. Kemudian saya menggunakan bridging header untuk pengujian untuk memastikan file ObjC saya yang saya rujuk di header bridging biasa saya tersedia. Berlari seperti pesona sekarang.
JADI pastikan PrimeNumberModel memiliki target Target pengujian Anda. Atau solusi High6 untuk mengimpor seluruh modul Anda akan berfungsi
sumber
Saya dapat mengatasi masalah ini dengan membersihkan bangunan saya.
Menu atas -> Produk -> Bersihkan Atau pintasan keyboard: Shift+ Cmd+K
sumber
Pada Swift 2.0, praktik terbaik adalah:
Tambahkan baris
@testable import MyApp
ke bagian atas file tes Anda, di mana "MyApp" adalah Nama Modul Produk dari target aplikasi Anda (dapat dilihat di pengaturan build target aplikasi Anda ). Itu dia.(Perhatikan bahwa nama modul produk akan sama dengan nama target aplikasi Anda kecuali nama target aplikasi Anda berisi spasi, yang akan diganti dengan garis bawah. Misalnya, jika target aplikasi saya disebut "Permainan Menyenangkan" saya akan menulis
@testable import Fun_Game
di atas tes saya.)sumber
Anda perlu menambahkan rutin untuk kompiler untuk referensi sebagai titik masuk, jadi tambahkan file main.swift, yang dalam hal ini hanya membuat turunan dari file pengujian Anda:
cepat
Kemudian kompilasi pada baris perintah (saya menggunakan El Capitan dan Swift 2.2):
Dalam hal ini, Anda akan mendapatkan peringatan: hasil initializer tidak digunakan , tetapi program mengkompilasi dan dieksekusi:
CAVEAT: Saya menghapus jenis impor XCTest dan XCTestCase untuk kesederhanaan.
sumber
Periksa
PrimeNumberModelTests
Pengaturan Target Anda .Jika Anda tidak dapat melihat
PrimeNumberModel.swift
file di BuildPhases/Compile Sources
, tambahkan.sumber
Jadi, Anda harus melakukannya
Dalam kasus saya, saya memiliki file cepat yang ingin saya uji unit, dan file uji unit juga kelas cepat. Saya memastikan pengubah akses sudah benar, tetapi pernyataan itu
(katakanlah stMobile adalah nama target kami)
masih tidak bekerja (saya masih mendapatkan kesalahan 'Tidak ada modul'), saya memeriksa target saya, dan namanya memang stMobile. Jadi, saya pergi ke Pengaturan Bangun, di bawah pengemasan, dan menemukan Nama Modul Produk, dan untuk beberapa alasan ini disebut St_Mobile, jadi saya mengubah pernyataan impor saya
(yang merupakan Nama Modul Produk ), dan semuanya berfungsi.
Jadi, untuk meringkas:
Periksa Nama Modul Produk Anda dan gunakan pernyataan impor di bawah ini di kelas uji unit Anda
Pastikan pengubah akses Anda benar (tingkat kelas dan metode Anda).
sumber
Alih-alih membutuhkan impor eksplisit, kompiler Swift secara implisit mencari
.swiftmodule
file perpustakaan Swift dependensi.Xcode dapat membangun modul cepat untuk Anda, atau merujuk ke blog railsware untuk instruksi baris perintah
swiftc
.sumber
Seperti @ high6 dan @ erik-p-hansen tunjukkan dalam jawaban yang diberikan oleh @ high6, ini dapat diatasi dengan mengimpor target untuk modul di mana kelas PrimeNumberModel berada, yang mungkin nama yang sama dengan proyek Anda dalam proyek sederhana .
Sambil melihat ini, saya menemukan artikel Menulis Tes Unit pertama Anda di Swift di swiftcast.tv oleh Clayton McIlrath. Ini membahas pengubah akses, menunjukkan contoh dari masalah yang sama yang Anda alami (tetapi untuk ViewController daripada file model) dan menunjukkan cara mengimpor target dan memecahkan masalah pengubah akses dengan memasukkan file tujuan dalam target, yang berarti Anda tidak harus membuat kelas yang Anda coba uji publik kecuali Anda benar-benar ingin melakukannya.
sumber