ios tutorial
Pruebas unitarias Swift 2.0, @testable import, y esquemas de segmentación (5)
Recientemente he convertido mi aplicación y las pruebas unitarias a Swift 2.0. Estoy usando el nombre de @testable import AppName
en mis archivos Tests.swift.
Debido a un problema con la EntityName
ejecutar subclases en múltiples destinos ( consulte aquí el problema ), mi clase EntityName
solo puede ser de Target Membership AppName
y NO AppNameTests
.
El problema es que, una vez que cambio al esquema AppNameTests
para ejecutar pruebas unitarias, el código en el módulo AppName
no puede encontrar la clase EntityName
y obtengo
Uso de tipo no declarado ''EntityName''
¿Cómo consigo que AppName
compile cuando se ejecutan pruebas desde el esquema AppNameTests
sin que esa clase de entidad no sea miembro del esquema?
Debido a un problema con no poder ejecutar subclases en múltiples objetivos
Al compilar el mismo código Swift como parte de diferentes objetivos, el compilador genera clases diferentes . Por lo tanto, esto se comporta según lo diseñado, pero es casi seguro que no es lo que desea cuando ejecuta las pruebas de unidad de una aplicación.
Hay dos formas en las que te recomendaría que configures tus modelos para permitir las pruebas:
1. Modelos públicos (recomendados)
En su aplicación de destino:
import RealmSwift
public class MyModel: Object {}
Este código solo debe compilarse como parte del objetivo de su aplicación, y sus pruebas unitarias se pueden configurar de la siguiente manera:
import MyApp
// should be able to access `MyModel`
¿Suficientemente fácil?
2. @Testable (solo Swift 2)
Este enfoque se basa en la palabra clave @testable
introducida en Swift 2.
En su aplicación de destino:
import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`
Nuevamente, este código solo debe compilarse como parte de su objetivo de aplicación, y sus pruebas unitarias se pueden configurar de la siguiente manera:
@testable import MyApp
// should be able to access `MyModel`
Asegúrese de que la configuración de compilación de MyApp tenga la Enable Testability
establecida en YES
.
Este enfoque puede ser preferible a los modelos públicos si está creando un marco donde algunos modelos internos no deberían ser accesibles desde los usuarios de ese marco.
Realm tiene una sección dedicada de su documentación que detalla estos enfoques comunes para las pruebas que puede leer aquí: https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets
Primero asegúrese de que @testable import MyApp
esté incluido en cada archivo de prueba. Luego, en sus Fases de compilación de objetivo de prueba, elimine todos los archivos que no sean de prueba en las secciones Copiar recursos del paquete. Los archivos de aplicaciones que están en su objetivo de prueba que apuntan a los archivos de aplicación que no están en su objetivo de prueba están rompiendo sus pruebas de unidad. Elimine todos los archivos de aplicaciones de su objetivo de prueba y agregue la @testable
y todo debería funcionar.
Tuve que dejar de apuntar a todos mis archivos de aplicaciones .swift para ser miembro de MyAppTests, y confiar únicamente en @testable import MyApp
Tuve un problema similar y el problema fue que todos los archivos de origen de la aplicación estaban vinculados al objetivo de prueba de la unidad, ¡y así se compilaron dos veces!
Además, instalé Realm a través de Carthage y tuve que incluir ambos objetivos (main y test) para los marcos "Realm.framework" y "RealmSwift.framework" porque no funcionaría de otra manera.
Aquí está el enlace del tema