Я просто хочу включить мой класс 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
файлах, но не в обычных файлах проекта.Чтобы избавиться от:
Мне нужно, чтобы
import
базовый модуль в тестовом файле. В моем случае моя цель называется myproject, и я добавил,import myproject
и класс был распознан.источник
public
. В противном случаеXCTestCase
подкласс не сможет «увидеть» то, что вы пытаетесь проверить. Я потратил несколько часов на эту последнюю ночь :)import
выраженииОБНОВЛЕНИЕ Swift 2.x, 3.x, 4.x и 5.x
Теперь вам не нужно добавлять
public
методы для тестирования. В новых версиях Swift необходимо только добавить@testable
ключевое слово.PrimeNumberModelTests.swift
И ваши внутренние методы могут сохранить
Internal
PrimeNumberModel.swift
Обратите внимание, что
private
(иfileprivate
) символы недоступны даже при использовании@testable
.Swift 1.x
Здесь есть две соответствующие концепции от Swift (как Xcode 6 beta 6).
Internal access
Принимая во внимание, что тесты находятся на другой цели,
PrimeNumberModelTests.swift
вам нужно, чтобыimport
цель содержала класс, который вы хотите протестировать, и если ваша цель вызываетсяMyProject
, нужно добавитьimport MyProject
вPrimeNumberModelTests
:PrimeNumberModelTests.swift
Но этого недостаточно для тестирования вашего класса
PrimeNumberModel
, так как по умолчанию установлен уровень контроля доступаInternal Access
, ваш класс не будет виден тестовому комплекту, поэтому вам нужно создать егоPublic Access
и все методы, которые вы хотите протестировать:PrimeNumberModel.swift
источник
No such module <moduleName>
в вашем тестовом примере вы получаете ошибку компиляции, вы можете проверитьPRODUCT_MODULE_NAME
наличие цели теста. Отличный ответ Диого.В документации сказано, что в Swift нет операторов импорта.
Просто используйте:
источник
Проверьте целевое членство PrimeNumberModel.swift в вашей цели тестирования.
источник
В Objective-C, если вы хотите использовать класс в другом файле, вам нужно его импортировать:
Однако в Swift вам не нужно импортировать вообще. Просто используйте его, как если бы он был уже импортирован.
пример
Как видите, импорт не был необходим. Надеюсь это поможет.
источник
Согласно Apple, вам не нужно импортировать быстрые файлы в той же цели. Наконец-то я заработал, добавив свой swift-файл как к обычной цели, так и к контрольной цели. Затем я использовал для проверки заголовок моста, чтобы убедиться, что мои файлы ObjC, на которые я ссылался в моем обычном заголовке моста, были доступны. Бежал как очарование сейчас.
Поэтому убедитесь, что у PrimeNumberModel есть цель вашей тестовой цели. Или High6 решение импорта всего вашего модуля будет работать
источник
Я смог решить эту проблему, очистив мою сборку.
Главное меню -> Продукт -> Очистить или сочетание клавиш: Shift+ Cmd+K
источник
Начиная с Swift 2.0, лучшая практика:
Добавьте строку
@testable import MyApp
в верхней части файла тестов, где «MyApp» - это имя модуля продукта для цели вашего приложения (отображается в настройках сборки цели вашего приложения ). Вот и все.(Обратите внимание, что имя модуля продукта будет совпадать с именем цели вашего приложения, если только имя цели вашего приложения не содержит пробелов, которые будут заменены подчеркиванием. Например, если бы цель моего приложения называлась «Веселая игра», я написал бы
@testable import Fun_Game
на вершина моих тестов.)источник
Вам нужно добавить подпрограмму для ссылки компилятора как на точку входа, поэтому добавьте файл main.swift, который в этом случае просто создает экземпляр вашего тестового файла:
main.swift
Затем скомпилируйте в командной строке (я использую El Capitan и Swift 2.2):
В этом случае вы получите предупреждение: результат инициализатора не используется , но программа компилируется и является исполняемой:
CAVEAT: я удалил импорт XCTest и XCTestCase типа для простоты.
источник
Проверьте
PrimeNumberModelTests
настройки цели.Если вы не видите
PrimeNumberModel.swift
файл в BuildPhases/Compile Sources
, добавьте его.источник
Итак, вам нужно
В моем случае у меня был файл swift, который я хотел пройти модульное тестирование, и файл модульного теста также был классом swift. Я убедился, что модификаторы доступа были правильными, но утверждение
(скажем, stMobile - наше целевое имя)
все еще не работал (я все еще получал ошибку «Нет такого модуля»), я проверил свою цель, и ее имя действительно было stMobile. Итак, я зашел в «Настройки сборки» в разделе «Упаковка» и нашел имя модуля продукта, и по какой-то причине оно называлось St_Mobile, поэтому я изменил свой оператор импорта
(что является названием модуля продукта ), и все работает.
Итак, подведем итог:
Проверьте свое имя модуля продукта и используйте приведенный ниже оператор импорта в классе юнит-теста
Убедитесь, что ваши модификаторы доступа верны (уровень класса и ваши методы).
источник
Вместо того, чтобы требовать явного импорта, компилятор Swift неявно ищет
.swiftmodule
файлы зависимых библиотек Swift.XCode может создать быстрые модули для вас, или обратитесь к блогу railsware за инструкциями командной строки для
swiftc
.источник
Как отметили @ high6 и @ erik-p-hansen в ответе, заданном @ high6, это можно преодолеть, импортировав цель для модуля, где находится класс PrimeNumberModel, который, вероятно, совпадает с именем вашего проекта в простом проекте. ,
Глядя на это, я наткнулся на статью Clayton McIlrath « Первый тестовый модуль в Swift» на swiftcast.tv. В нем рассматриваются модификаторы доступа, показан пример той же проблемы, с которой вы столкнулись (но для ViewController, а не файла модели), и показано, как импортировать цель и решить проблему модификатора доступа путем включения файла назначения в цель, что означает вам не нужно делать класс, который вы пытаетесь протестировать, публичным, если вы на самом деле не хотите этого делать.
источник