Simplemente quiero incluir mi clase Swift de otro archivo, como su prueba
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'"
}
Ambos archivos rápidos están en el mismo directorio.
Respuestas:
Tuve el mismo problema, también en mis
XCTestCase
archivos, pero no en los archivos normales del proyecto.Para deshacerse de:
Necesitaba
import
el módulo base en el archivo de prueba. En mi caso, mi objetivo se llama 'myproject' y agreguéimport myproject
y la clase fue reconocida.fuente
public
. De lo contrario, laXCTestCase
subclase no podrá "ver" lo que está intentando probar. Perdí unas horas en esta última noche :)import
declaraciónACTUALIZACIÓN Swift 2.x, 3.x, 4.xy 5.x
Ahora no necesita agregar el
public
a los métodos para probar entonces. En las versiones más recientes de Swift solo es necesario agregar la@testable
palabra clave.PrimeNumberModelTests.swift
Y sus métodos internos pueden mantener
Internal
PrimeNumberModel.swift
Tenga en cuenta que
private
(yfileprivate
) los símbolos no están disponibles incluso con el uso@testable
.Swift 1.x
Aquí hay dos conceptos relevantes de Swift (como Xcode 6 beta 6).
Internal access
Teniendo en cuenta que las pruebas están en otro objetivo en el
PrimeNumberModelTests.swift
que necesitaimport
el objetivo que contiene la clase que desea probar, si se llama a su objetivoMyProject
deberá agregarimport MyProject
aPrimeNumberModelTests
:PrimeNumberModelTests.swift
Pero esto no es suficiente para probar su clase
PrimeNumberModel
, ya que el nivel de control de acceso predeterminado es queInternal Access
su clase no será visible para el paquete de prueba, por lo que debe hacerloPublic Access
y todos los métodos que desea probar:PrimeNumberModel.swift
fuente
No such module <moduleName>
error de compilación en su caso de prueba, es posible que desee verificar elPRODUCT_MODULE_NAME
objetivo de la prueba. Gran respuesta Diogo.En la documentación dice que no hay declaraciones de importación en Swift.
Simplemente use:
fuente
Verifique la membresía objetivo de PrimeNumberModel.swift en su objetivo de prueba.
fuente
En Objective-C, si deseaba usar una clase en otro archivo, tenía que importarla:
Sin embargo, en Swift, no tiene que importar nada. Simplemente utilícelo como si ya estuviera importado.
Ejemplo
Como puede ver, no se necesitaba importar. Espero que esto ayude.
fuente
Según Apple, no necesita importar archivos rápidos en el mismo destino. Finalmente conseguí que funcione agregando mi archivo swift tanto a mi objetivo regular como a mi objetivo de prueba. Luego utilicé el encabezado de puente para la prueba para asegurarme de que mis archivos ObjC a los que hice referencia en mi encabezado de puente regular estaban disponibles. Corrió como un encanto ahora.
ASÍ que asegúrese de que PrimeNumberModel tenga un objetivo de su Objetivo de prueba. O la solución High6 de importar todo tu módulo funcionará
fuente
Pude resolver este problema limpiando mi compilación.
Menú superior -> Producto -> Limpiar o método abreviado de teclado: Shift+ Cmd+K
fuente
A partir de Swift 2.0, la mejor práctica es:
Agregue la línea
@testable import MyApp
en la parte superior de su archivo de pruebas, donde "MyApp" es el nombre del módulo del producto del objetivo de su aplicación (visible en la configuración de compilación del objetivo de su aplicación ). Eso es.(Tenga en cuenta que el nombre del módulo del producto será el mismo que el nombre del objetivo de su aplicación a menos que el nombre del objetivo de la aplicación contenga espacios, que se reemplazarán con guiones bajos. Por ejemplo, si el objetivo de mi aplicación se llamara "Juego divertido", escribiría
@testable import Fun_Game
en el arriba de mis pruebas.)fuente
Debe agregar una rutina para que el compilador haga referencia como un punto de entrada, así que agregue un archivo main.swift, que en este caso simplemente crea una instancia de su archivo de prueba:
main.swift
Luego compile en la línea de comando (estoy usando El Capitan y Swift 2.2):
En este caso, recibirá una advertencia: el resultado del inicializador no se utiliza , pero el programa se compila y es ejecutable:
CAVEAT: Eliminé el tipo XCTest y XCTestCase de importación por simplicidad.
fuente
Verifique su
PrimeNumberModelTests
configuración de destino.Si no puede ver el
PrimeNumberModel.swift
archivo en BuildPhases/Compile Sources
, agréguelo.fuente
Entonces, necesitas
En mi caso, tenía un archivo rápido que quería probar unitario, y el archivo de prueba unitario también era una clase rápida. Me aseguré de que los modificadores de acceso fueran correctos, pero la declaración
(digamos que stMobile es nuestro nombre objetivo)
todavía no funcionaba (todavía recibía el error 'No hay tal módulo'), verifiqué mi objetivo y su nombre era stMobile. Entonces, fui a Build Settings, en el paquete, y encontré el Nombre del módulo del producto, y por alguna razón se llamaba St_Mobile, así que cambié mi declaración de importación
(que es el nombre del módulo del producto ), y todo funcionó.
Así que para resumir:
Verifique el nombre del módulo del producto y use la declaración de importación a continuación en su clase de prueba unitaria
Asegúrese de que sus modificadores de acceso sean correctos (nivel de clase y sus métodos).
fuente
En lugar de requerir importaciones explícitas, el compilador Swift busca implícitamente
.swiftmodule
archivos de bibliotecas Swift de dependencia.Xcode puede construir módulos rápidos para usted, o consulte el blog de railsware para obtener instrucciones sobre la línea de comandos
swiftc
.fuente
Como @ high6 y @ erik-p-hansen señalaron en la respuesta dada por @ high6, esto se puede superar importando el objetivo para el módulo donde está la clase PrimeNumberModel, que probablemente sea el mismo nombre que su proyecto en un proyecto simple .
Mientras miraba esto, me encontré con el artículo Escriba su primera prueba de unidad en Swift en swiftcast.tv por Clayton McIlrath. Analiza los modificadores de acceso, muestra un ejemplo del mismo problema que tiene (pero para un ViewController en lugar de un archivo de modelo) y muestra cómo importar el objetivo y resolver el problema del modificador de acceso al incluir el archivo de destino en el objetivo, lo que significa no tiene que hacer pública la clase que está tratando de evaluar a menos que realmente quiera hacerlo.
fuente