Estoy tratando de escribir una extensión para el marco XCTest en Swift. Para hacerlo, creé un proyecto con dos objetivos: el objetivo principal/de producción y un objetivo de prueba.
Como estoy escribiendo una extensión para XCTest, también necesito importar XCTest dentro de mi objetivo principal/de producción. Sin embargo, tengo problemas para hacerlo. Cuando estoy en Xcode y hago clic en mi proyecto, luego selecciono el objetivo principal, voy a Build Phases, Link Binary With Libraries y agrego XCTest allí, aparece un error de compilación:
ld: marco no encontrado XCTest clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación)
También probé la solución provista aquí que desafortunadamente tampoco funciona.
La información auxiliar sobre XCTest en sí es escasa y difícil de encontrar, también estaba persiguiendo la misma funcionalidad y finalmente logré que funcionara.
Estoy en XCode 10.1 y ejecuto un iPhone real con iOS 11. Estoy seguro de que la técnica general funcionará para otras versiones, pero probablemente requerirá algunos ajustes.
Los pasos generales se describen en esta respuesta de stackoverflow, pero requirieron varios pasos y ajustes adicionales para que funcionen para mí en un iPhone real:
¿Es posible ejecutar pruebas XCTest en una aplicación de iOS?
Sigue los pasos del enlace anterior. Los pasos a continuación son desviaciones de las instrucciones que se requieren para mí.
Copie en el marco XCTest como se describe en el enlace anterior. NOTA: Use el marco para la plataforma iPhone.OS y no el simulador como se describe. Puede encontrar este archivo de marco dentro del paquete de la aplicación XCode real en su mac. (Haga clic derecho, "Mostrar contenido del paquete", luego busque en ./Contents/Developer/Platforms/iPhoneOS.platform
Deshabilite el código de bits en el destino de su aplicación. Esto resuelve un error del enlazador. Aquí hay un ejemplo de cómo habilitarlo: ¿cómo ENABLE_BITCODE en xcode 7?
Al arrastrar el archivo XCTest.framework a los binarios vinculados en su destino, asegúrese de arrastrarlo también a los "Binarios integrados", que se encuentra directamente encima de la opción "Bibliotecas y marcos vinculados". Si no hace esto, obtendrá un error de tiempo de ejecución.
import UIKit import XCTest class ViewController: UIViewController { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { print("running tests!") let suite = XCTestSuite.default; for test in suite.tests { test.run() } } }¡Eso debería ser! Cuando ejecuto la aplicación anterior, luego toco la pantalla, ¡todas las pruebas de mi objetivo UITesting se ejecutan sin problemas y pasan!