Chcę po prostu dołączyć moją klasę Swift z innego pliku, na przykład jej test
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'"
}
Oba pliki Swift znajdują się w tym samym katalogu.
Odpowiedzi:
Miałem ten sam problem, także w moich
XCTestCase
plikach, ale nie w zwykłych plikach projektu.Aby pozbyć się:
Potrzebowałem do
import
modułu podstawowego w pliku testowym. W moim przypadku mój cel nazywa się „mójimport myproject
projekt ” i dodałem i klasa została rozpoznana.źródło
public
. W przeciwnym razieXCTestCase
podklasa nie będzie w stanie „zobaczyć” tego, co próbujesz przetestować. Zmarnowałem kilka godzin tej ostatniej nocy :)import
instrukcjiAKTUALIZACJA Swift 2.x, 3.x, 4.x i 5.x
Teraz nie musisz dodawać
public
do metod testowania. W nowszych wersjach Swift konieczne jest jedynie dodanie@testable
słowa kluczowego.PrimeNumberModelTests.swift
A twoje wewnętrzne metody mogą się utrzymać
Internal
PrimeNumberModel.swift
Pamiętaj, że symbole
private
(ifileprivate
) nie są dostępne nawet przy użyciu@testable
.Swift 1.x
Istnieją dwie istotne koncepcje ze Swift (As Xcode 6 beta 6).
Internal access
Biorąc pod uwagę, że testy są na innym celu
PrimeNumberModelTests.swift
, musisz doimport
celu zawierającego klasę, którą chcesz przetestować, jeśli twój cel zostanie wywołany,MyProject
będziesz musiał dodaćimport MyProject
doPrimeNumberModelTests
:PrimeNumberModelTests.swift
Ale to nie wystarczy, aby przetestować swoją klasę
PrimeNumberModel
, ponieważ domyślny poziom kontroli dostępu toInternal Access
, Twoja klasa nie będzie widoczna dla pakietu testowego, więc musisz to zrobićPublic Access
i wszystkie metody, które chcesz przetestować:PrimeNumberModel.swift
źródło
No such module <moduleName>
błąd kompilacji w swoim przypadku testowym, możesz chcieć sprawdzićPRODUCT_MODULE_NAME
cel testowy. Świetna odpowiedź Diogo.W Dokumentacji jest napisane, że w Swift nie ma instrukcji importu.
Po prostu użyj:
źródło
Sprawdź członkostwo docelowe PrimeNumberModel.swift w swoim celu testowym.
źródło
W Objective-C, jeśli chcesz użyć klasy w innym pliku, musisz ją zaimportować:
Jednak w Swift nie musisz w ogóle importować. Po prostu użyj go tak, jakby był już zaimportowany.
Przykład
Jak widać, import nie był potrzebny. Mam nadzieję że to pomoże.
źródło
Według Apple nie potrzebujesz importu plików Swift w tym samym celu. W końcu udało mi się to uruchomić, dodając mój szybki plik zarówno do mojego zwykłego celu, jak i celu testowego. Następnie użyłem nagłówka mostkującego do testu, aby upewnić się, że moje pliki ObjC, do których odwoływałem się w moim zwykłym nagłówku mostkowania, są dostępne. Biegał teraz jak urok.
Dlatego upewnij się, że PrimeNumberModel ma cel Twojego celu testowego. Lub rozwiązanie High6 polegające na imporcie całego modułu będzie działać
źródło
Udało mi się rozwiązać ten problem, czyszcząc moją kompilację.
Górne menu -> Produkt -> Wyczyść lub skrót klawiaturowy: Shift+ Cmd+K
źródło
Od wersji Swift 2.0 najlepszą praktyką jest:
Dodaj wiersz
@testable import MyApp
na początku pliku testów, gdzie „MojaApl.” To nazwa modułu produktu celu aplikacji (widoczna w ustawieniach kompilacji celu aplikacji ). Otóż to.(Zwróć uwagę, że nazwa modułu produktu będzie taka sama, jak nazwa celu aplikacji, chyba że nazwa celu aplikacji zawiera spacje, które zostaną zastąpione podkreśleniami. Na przykład, jeśli mój cel aplikacji nazywa się „Zabawna gra”, napiszę
@testable import Fun_Game
w najlepsze z moich testów.)źródło
Musisz dodać procedurę, do której kompilator będzie odwoływał się jako punkt wejścia, więc dodaj plik main.swift, który w tym przypadku po prostu tworzy instancję twojego pliku testowego:
main.swift
Następnie skompiluj w wierszu poleceń (używam El Capitan i Swift 2.2):
W takim przypadku pojawi się ostrzeżenie: wynik inicjatora jest nieużywany , ale program kompiluje się i jest wykonywalny:
UWAGA: dla uproszczenia usunąłem import typu XCTest i XCTestCase.
źródło
Sprawdź ustawienia
PrimeNumberModelTests
celu.Jeśli nie widzisz
PrimeNumberModel.swift
pliku w BuildPhases/Compile Sources
, dodaj go.źródło
Więc musisz
W moim przypadku miałem plik Swift, który chciałem przetestować jednostkowo, a plik testu jednostkowego był również klasą Swift. Upewniłem się, że modyfikatory dostępu są poprawne, ale oświadczenie
(powiedzmy, że stMobile to nasza nazwa docelowa)
nadal nie działał (ciągle otrzymywałem błąd „Nie ma takiego modułu”), sprawdziłem cel i faktycznie jego nazwa brzmiała stMobile. Więc poszedłem do ustawień kompilacji, pod opakowaniem i znalazłem nazwę modułu produktu iz jakiegoś powodu nazywało się to St_Mobile, więc zmieniłem moje oświadczenie importu
(która jest nazwą modułu produktu ) i wszystko działało.
Więc by podsumować:
Sprawdź nazwę modułu produktu i użyj poniższej instrukcji importu w klasie testów jednostkowych
Upewnij się, że modyfikatory dostępu są poprawne (poziom klasy i metody).
źródło
Zamiast wymagać jawnego importu, kompilator Swift niejawnie wyszukuje
.swiftmodule
pliki bibliotek Swift zależności.Xcode może zbudować dla Ciebie szybkie moduły lub zapoznać się z blogiem dotyczącym oprogramowania railsware, aby uzyskać instrukcje wiersza poleceń dotyczące
swiftc
.źródło
Jak @ high6 i @ erik-p-hansen wskazali w odpowiedzi udzielonej przez @ high6, można temu zaradzić, importując cel modułu, w którym znajduje się klasa PrimeNumberModel, która prawdopodobnie ma taką samą nazwę jak Twój projekt w prostym projekcie .
Patrząc na to, natknąłem się na artykuł Napisz swój pierwszy test jednostkowy w języku Swift na swiftcast.tv autorstwa Claytona McIlratha. Omawia modyfikatory dostępu, pokazuje przykład tego samego problemu, który masz (ale dla ViewController zamiast pliku modelu) i pokazuje, jak zarówno zaimportować cel, jak i rozwiązać problem modyfikatora dostępu, włączając plik docelowy do celu, co oznacza nie musisz upubliczniać klasy, którą próbujesz przetestować, chyba że rzeczywiście tego chcesz.
źródło