tutorial ios swift unit-testing swift2 realm

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.


También recibí este error recientemente y ninguno de los pasos anteriores solucionó el problema, lo que lo solucionó fue la eliminación de archivos no rápidos de la fase de compilación de fuentes de Compilación en el Objetivo en el que desea ejecutar las pruebas. Esto estaba fallando en silencio


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

https://github.com/realm/realm-cocoa/issues/3627